ヒープのソート--小根ヒープの作成と調整

8526 ワード

  • ネット上の小根ヒープ(ヒープソート)に関するブログは多くありません.コードがまだそろっていないものもあります.初心者向けのコードを見つけて共有します.
  • 次のコードを見る前にスタックの並べ替えの図示方法を一度見ることをお勧めします.コードと本の例を合わせて見ると
  • がわかりやすいです.
  • 原作者は彼のブログですでに詳しく書いています.VSはコードに対する要求が高いので、私は原作者に空間を割り当て、空間を増やす関数にもっと規範的な書き方を使いました.以下はコードです.
  • #include
    #include
    typedef int ElemType;
    struct HeapSq //          
    {
        ElemType* heap; //             
        int len; //          ,     ,     0  
        int MaxSize;    //                    
    };
    
    //1、    
    void InitHeap(struct HeapSq* HBT, int MS)
    {
        if (MS <= 0)
        {
            printf("         ,     !
    "
    ); exit(1); } HBT->heap = malloc(MS*sizeof(ElemType)); if (!HBT->heap) { printf(" , !
    "
    ); exit(1); } HBT->MaxSize = MS; HBT->len = 0; } //2、 void ClearHeap(struct HeapSq* HBT) { if (HBT->heap != NULL) { free(HBT->heap); HBT->len = 0; HBT->MaxSize = 0; } } //3、 int EmptyHeap(struct HeapSq* HBT) { if (HBT->len == 0) return 1; else return 0; } //4、 void InsertHeap(struct HeapSq* HBT, ElemType x) { int i; if (HBT->len == HBT->MaxSize) // , 2 { ElemType *p; p = realloc(HBT->heap, 2*HBT->MaxSize*sizeof(ElemType)); if (!p) { printf(" !
    "
    ); exit(1); } printf(" 2 !
    "
    ); HBT->heap = p; HBT->MaxSize = 2*HBT->MaxSize; } HBT->heap[HBT->len] = x; // HBT->len++; // 1 i = HBT->len - 1; //i , , while (i != 0) { int j = (i - 1) / 2; //j i if (x >= HBT->heap[j]) // , , break; HBT->heap[i] = HBT->heap[j]; // i = j; // , } HBT->heap[i] = x;// } //5、 ElemType DeleteHeap(struct HeapSq* HBT) { ElemType temp, x; int i, j; if (HBT->len == 0) { printf(" , !
    "
    ); exit(1); } temp = HBT->heap[0]; // HBT->len--; if (HBT->len == 0) // return temp; x = HBT->heap[HBT->len]; // x , i = 0; // i , j = 2 * i + 1;// j i , 1 while (j <= HBT->len - 1)// , , { if (j < HBT->len - 1 && HBT->heap[j] > HBT->heap[j+1])// , j j++; if (x <= HBT->heap[j]) // x , , break; HBT->heap[i] = HBT->heap[j];// , i = j; // j = 2 * i + 1;// j , } HBT->heap[i] = x; // x return temp; // } // void main() { int i, x; int a[8] = {23,56,40,62,38,55,10,16}; struct HeapSq b; InitHeap(&b, 10); for (i = 0; i < 8; i++) InsertHeap(&b, a[i]); while (!EmptyHeap(&b)) // , { x = DeleteHeap(&b); printf("%d", x); if (!EmptyHeap(&b)) printf(","); } printf("
    "
    ); system("pause"); ClearHeap(&b); }
  • 原作者はスタックのソートに対する理解が透徹しており、コードの書くことも規範的であり、空間の申請と釈放も正確であり、彼のブログ(参考部分参照)
  • を直接見ることをお勧めします.
    参照先:https://www.cnblogs.com/zl0372/p/min_heap.html