看資料結構寫程式碼(63) 堆排序
阿新 • • 發佈:2019-01-22
// HeapSort.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <cstdlib> #define LIST_MAX_SIZE 100 //順序表 struct sqList{ int base[LIST_MAX_SIZE]; int len; }; typedef sqList Heap;//順序表作為堆排序的基本型別 //初始化順序表 void initHeap(Heap * list,int * array,int len){ //0號單元不儲存. for (int i = 0; i < len; i++){ list->base[i+1] = array[i]; } list->len = len; } //向下篩選(最小堆) void siftDown(Heap *h,int i){ int len = h->len; int minIndex = i; bool finished = false;//完成標誌 for (int j = 2 * i; j <= len && finished == false; j= 2 * i){ if (h->base[j] < h->base[i]){ minIndex = j; } if (j + 1 <= len){ if (h->base[j+1] < h->base[minIndex]){ minIndex = j + 1; } } if (minIndex != i){ int temp = h->base[minIndex]; h->base[minIndex] = h->base[i]; h->base[i] = temp; i = minIndex; } else{ finished = true;//完成篩選。 } } } //建立堆 void createHeap(Heap * h){ int len = h->len; for (int i = len / 2; i >= 1; i--){ siftDown(h,i); } printf("---------------建立堆---------------\n"); for (int i = 1; i <= h->len; i++){ printf("%d\t",h->base[i]); } printf("\n"); } void heapSort(Heap h){ printf("---------------堆排序---------------\n"); for (int i = h.len; i >= 1; i--){ printf("%d\t",h.base[1]); h.base[1] = h.base[i]; h.len--; siftDown(&h,1); } } int _tmain(int argc, _TCHAR* argv[]) { int testArray[10] = {77,66,44,33,11,22,55,99,88,100}; Heap h; initHeap(&h,testArray,10); createHeap(&h); heapSort(h); return 0; }
具體程式碼解釋 看 上面的 兩個網址就行了,然後 給 《啊哈磊》 贊 一個。