1, 簡述
堆結構是一種陣列結構,它可以被視為一棵完全二叉樹。
屬性:元素個數(length[a]), 樹的根為a[1], 給定某個節點下標i, 其父節點parent(i),左兒子left(i),右兒子right(i).存在以一關係:
parent(i)= i/2;
left(i) = 2i;
right(i) = 2i+1
堆應滿足以下性質:
a parent(i)]≧a[i];
節點高度:從該節點到樹的葉節點的最長向下的簡單路徑上邊的數目。
樹的高度:根節點高度。
2,堆排序
三個過程
1) heapify過程,執行時間為o(lgn),是用來維持堆性質的關鍵。
2) build-heap過程,以線性時間執行,可以從無序的輸入陣列中構造出乙個堆來。
3) heapsort過程,執行時間為o(nlgn),對乙個陣列程序排序。
heapify:維持當前節點與其子節點的堆性質。
build-heap:將整個陣列構建成堆,每個節點均滿足堆的性質。
1 for i=length[a]/2 downto 1
do heapify(a, i)
此過程對每個非葉節點都呼叫一次heapify,對各節點的處理次序保證了以某個節點i的子節點為根的子樹都已成為堆後才處理i.此過程可以認為是線性時間過程,詳細證明見演算法導論。
heapsort:
堆中最大元素在a[1],將a[1]與a[n]互換,並將最後乙個節點去掉,將剩餘元素重新構建成堆。直至堆的大小為2為止。
#include
#include
#define left(i) (i<<1)
#define right(i) (left(i)|0x1)
#define max_len 10000
//#define max_len 100000
int array[max_len];
void heapify(int *arr,int len, int i);
void swap(int *a, int *b);
void print_array(int *arr);
void init_array(int *arr);
void build_heap(int *arr, int len);
void swap(int *a, int *b)
void heapify(int *arr, int len, int i)
}void build_heap(int *arr, int len)
}int main(void)
time(&ts2);
print_array(array);
printf("time:%lx;%lx;%lx",ts1, ts2, ts2-ts1);
return 0;
}void init_array(int *arr)
void print_array(int *arr)
printf("\n");
}
排序演算法原理簡述及C語言實現
部落格點滴積累,部分話語和知識點 於網路,感謝網路資源的提供者 1 氣泡排序 原理簡述 氣泡排序,大泡泡在底下,小泡泡在上面,假設遞增排序,即小數在前面,大數在後面。每一次比較相鄰的兩個數,第乙個數大於第二個數,就交換順序,一次比較到陣列結尾,最後乙個就是最大的數,再一次從頭開始比較,比較到倒數第二...
堆排序原理及其實現 C
我們知道簡單選擇排序的時間複雜度為o n 2 熟悉各種排序演算法的朋友都知道,這個時間複雜度是很大的,所以怎樣減小簡單選擇排序的時間複雜度呢?簡單選擇排序主要操作是進行關鍵字的比較,所以怎樣減少比較次數就是改進的關鍵。簡單選擇排序中第i趟需要進行n i次比較,如果我們用到前面已排好的序列a 1.i ...
堆排序原理及其實現 C
我們知道簡單選擇排序的時間複雜度為o n 2 熟悉各種排序演算法的朋友都知道,這個時間複雜度是很大的,所以怎樣減小簡單選擇排序的時間複雜度呢?簡單選擇排序主要操作是進行關鍵字的比較,所以怎樣減少比較次數就是改進的關鍵。簡單選擇排序中第i趟需要進行n i次比較,如果我們用到前面已排好的序列a 1.i ...