堆排序是利用了一種資料結構叫做二叉堆,二叉堆是這樣定義的:
二叉堆是一種特殊的堆,二叉堆是完全二元樹或者是近似完全二元樹,有最小堆和最大堆
特點:1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
利用堆排序資料的儲存方式如下:
以下是我的**實現:
/***************the min_heap_sort.c made by cfmlovers**************/
#include #define arraysize 4
void swap(int *m, int *n)
void min_heap_shift(int a, int i, int n)
void min_heapsize(int a, int n)
void min_heap_sort(int a, int n)
}void main()
其中min_heap_shift的非遞迴實現如下:
void min_heap_shift(int a, int i, int n)
a[i] = temp;
}
如果在面試中需要我們去寫堆排序,就記住兩點三函式:
1.堆化乙個陣列 min_heapsize
2.堆排序 min_heap_sort
其中每次發生交換資料的時候我們讀需要保持堆的特性,即min_heap_shift 函式
自己曾經寫過的錯的地方:
1.while(j < n)寫成了while(j +1 < n),這個以為左右孩子必須都小於n,其實錯了,右孩子可以沒有
2.把最後的a[i] = temp寫成了a[j] = temp;
這個地方用a[i]有以下幾層含義:
當j> n時,就是第一次沒有交換的時候,a[i] == temp;
當發生了交換,a[i] = a[j]; i = j;此時a[j]的值被賦予了a[i],而j = 2*i+1; 我們賦予a[j] = temp是錯的,賦予a[i] = temp才是對的
另外堆排序和快速排序,歸併排序的複雜度一樣都是o(n*logn),具體怎麼來的,可以去看《演算法導論》
堆排序的實現
file binaryheap.hpp brief 二叉堆 author xiao2 joyjj0218 qq.com version 1.0 date 2015.11.17 ifndef binaryheap hpp define binaryheap hpp include include us...
堆排序的實現
要想用堆來實現排序,首先得構建乙個堆。將字串 sortexample 放入起始下標為1的陣列中,構成一顆二叉樹 構造堆時,從最後乙個非葉子節點出發。如上圖所示,最後乙個非葉子節點下標為n 2 5,可以觀察出任意乙個大小為n的二叉堆的最後乙個非葉子節點的標號都是n 2。從5開始一直到根節點1,一直進行...
堆排序的實現
前面在執行希爾排序,插入排序的時候,我是以下標為0開始儲存順序表結點,但是在堆排序的時候發現這樣的結構對於堆排序這樣頻繁使用下標的演算法來說比較麻煩,於是我將原來的 修改了一下,使其下標從1開始 下面是具體函式實現 include include include includeusing names...