堆排序就是將一組數按二叉樹層序遍歷的儲存順序,經過一系列比較轉移,最終變成有序的陣列,這裡的二叉樹堆一定是完全二叉樹。堆排序能進行的基礎是有個最大堆的陣列,最大堆性質是指樹上的每個節點的子節點都比自己小或等於。
因此最頂上的根節點一定是值最大的節點,有了最大堆在,堆排序就可以進行了,從層序遍歷的最後乙個節點開始倒序迴圈,交換當前節點與最頂層根節點,即最大值的節點,這樣每次最大的節點都被放在層序遍歷的最後位置,類似氣泡排序了,而放了最大值的節點即從堆中排除(只要堆長度減一即表示堆沒有這個節點了),交換到頂點根節點的值再做一次下濾操作(以這個節點值與子樹的最大值交換),保證剩餘子樹一定也是最大堆性質。
貼**:
上面**中因為c陣列從0開始的原因,因此0位置不參與儲存和運算,資料形式是。#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;
}
堆排序演算法分析 《演算法導論》學習筆記
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 然後這些屬性就可以...