fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_SIZE 100
  5.  
  6. // ヒープを管理する構造体
  7. typedef struct {
  8. int data[MAX_SIZE];
  9. int size;
  10. } HeapA;
  11.  
  12. // 2つの値を入れ替える関数
  13. void swapA(int *a, int *b) {
  14. int temp = *a;
  15. *a = *b;
  16. *b = temp;
  17. }
  18.  
  19. // 最小ヒープを維持するためのダウンヒープ処理
  20. void downHeapA(HeapA *h, int i) {
  21. int smallest = i;
  22. int left = 2 * i + 1;
  23. int right = 2 * i + 2;
  24.  
  25. if (left < h->size && h->data[left] < h->data[smallest])
  26. smallest = left;
  27.  
  28. if (right < h->size && h->data[right] < h->data[smallest])
  29. smallest = right;
  30.  
  31. if (smallest != i) {
  32. swapA(&h->data[i], &h->data[smallest]);
  33. downHeapA(h, smallest);
  34. }
  35. }
  36.  
  37. // ヒープソート(降順)を行う関数
  38. void heapSortDescending(int arr[], int n) {
  39. HeapA h;
  40. h.size = n;
  41.  
  42. // 1. 配列のデータをヒープ構造体にコピー
  43. for (int i = 0; i < n; i++) {
  44. h.data[i] = arr[i];
  45. }
  46.  
  47. // 2. 最小ヒープの構築 (ボトムアップ)
  48. for (int i = (n / 2) - 1; i >= 0; i--) {
  49. downHeapA(&h, i);
  50. }
  51.  
  52. // 3. 最小値(根)を取り出し、配列の後ろから詰めていくことで降順にする
  53. for (int i = 0; i < n; i++) {
  54. arr[i] = h.data[0]; // 現在の最小値を取り出す
  55. h.data[0] = h.data[h.size - 1]; // 末尾の要素を根に移動
  56. h.size--; // サイズを減らす
  57. downHeapA(&h, 0); // 再度最小ヒープを再構築
  58. }
  59. }
  60.  
  61. int main() {
  62. int arr[] = {31, 14, 59, 26, 53, 58, 97};
  63. int n = sizeof(arr) / sizeof(arr[0]);
  64.  
  65. printf("元の配列:\n");
  66. for (int i = 0; i < n; i++) printf("%d ", arr[i]);
  67. printf("\n\n");
  68.  
  69. heapSortDescending(arr, n);
  70.  
  71. printf("ヒープソート後(降順):\n");
  72. for (int i = 0; i < n; i++) printf("%d ", arr[i]);
  73. printf("\n");
  74.  
  75. return 0;
  76. }
Success #stdin #stdout 0.01s 5324KB
stdin
Standard input is empty
stdout
元の配列:
31 14 59 26 53 58 97 

ヒープソート後(降順):
14 26 31 53 58 59 97