堆排序原理簡述及C實現例項

2021-05-28 18:03:01 字數 1523 閱讀 5482

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 ...