堆排序 《演算法導論》學習筆記六

2021-07-29 01:52:00 字數 1845 閱讀 3811

堆排序就是將一組數按二叉樹層序遍歷的儲存順序,經過一系列比較轉移,最終變成有序的陣列,這裡的二叉樹堆一定是完全二叉樹。堆排序能進行的基礎是有個最大堆的陣列,最大堆性質是指樹上的每個節點的子節點都比自己小或等於。

因此最頂上的根節點一定是值最大的節點,有了最大堆在,堆排序就可以進行了,從層序遍歷的最後乙個節點開始倒序迴圈,交換當前節點與最頂層根節點,即最大值的節點,這樣每次最大的節點都被放在層序遍歷的最後位置,類似氣泡排序了,而放了最大值的節點即從堆中排除(只要堆長度減一即表示堆沒有這個節點了),交換到頂點根節點的值再做一次下濾操作(以這個節點值與子樹的最大值交換),保證剩餘子樹一定也是最大堆性質。

貼**:

#include #include #include #include #include int parent( int );

int left( int );

int right( int );

inline int parent( int index )

inline int left( int index )

inline int right( int index )

//下濾

void max_heapify(

int *arr,

int heap_size,

int index )

else

if ( r <= heap_size && arr[r] > arr[largest] )

if ( largest != index )

}//構建最大堆

void build_max_heap(

int *arr,

int length,

int heap_size )

}//開始堆排序

void heap_sort(

int *arr,

int length,

int heap_size )

}void check_is_inc_arr(

int *arr,

int len )

}printf("check_is_inc_arr ok.\n");

}//初始化隨機數組

void initarr( int *arr, int lowv,

int upv, int len )

arr[0] = 0;

}void print_arr(

int *arr,

int len )

printf("\n*********************************************\n");

}int main(

int argc,

char **argv )

srand( (int)time(null) );

int length = atoi( argv[1] );

int lowv = atoi( argv[2] );

int upv = atoi( argv[3] );

int *arr = ( int * )malloc( sizeof(int) * (length + 1) );

initarr( arr, lowv, upv, length );

//print_arr( arr, length );

heap_sort( arr, length, length );

//print_arr( arr, length );

check_is_inc_arr( arr, length );

return 0;

}

上面**中因為c陣列從0開始的原因,因此0位置不參與儲存和運算,資料形式是。

堆排序演算法分析 《演算法導論》學習筆記

max heapify a,i 1 l left i 2 r right i 3ifl heap size a and a l a i 4thenlargest l 5elselargest i 6ifr heap size a and a r a largest 7thenlargest r 8i...

演算法導論學習筆記 第六章 堆排序

第六章 堆排序總結 這章主要講了堆 建堆 堆排序 優先順序佇列等。1.堆 堆可以被視為一顆完全二叉樹,底層用陣列實現。length a 陣列中的元素個數 heap size a 存放在a 中的堆的元素個數 樹的根a 1 給定某個結點的下標i 父節點parent i i 2 左節點left i 2i ...

演算法導論 學習筆記 第六章 堆排序

這一章主要講了兩個點 1.堆排序。2.堆排序的應用 優先順序佇列 堆堆是一種完全二叉樹 不理解 反正是一種樹狀的資料結構了吧。有幾種操作。求左子節點 2i 求右子節點 2i 1 求父節點 i 2 下取整。保持最大堆結構 max heapfiy 建堆 building a heap 然後這些屬性就可以...