首页 > 代码库 > 排序算法_HeapSort
排序算法_HeapSort
大根堆排序的基本思想:
1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区;
2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,
由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key;
3) 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,
由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系 R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
1 /* 2 大根堆排序的基本思想: 3 1) 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区; 4 2) 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 5 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key; 6 3) 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 7 然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换, 8 由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系 R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。 9 */10 11 /*12 @brief:13 已知L->r[s..len]中记录的关键字除L->r[s]之外均满足堆的定义,14 本函数调整L->r[s]的关键字,使L->r[s..len]成为一个大顶堆15 @param:16 cur: 当前位置 s17 len: 当前状态的最大值18 19 m:当前堆的大小20 */21 void HeapAdjust(SqList *L, int cur, int len)22 { 23 int temp = L->r[cur];24 for(int j = 2*cur; j <= len; j *= 2)// 沿关键字较大的孩子结点向下筛选(大根堆)25 {26 if(j < len && L->r[j] < L->r[j+1])27 ++j; // j为关键字中较大的记录的下标28 if(temp >= L->r[j])29 break; /* 应插入在位置 cur 上 */30 31 L->r[cur] = L->r[j];32 cur = j;33 }34 L->r[cur] = temp; /* 插入 */35 }36 37 /* 对顺序表L进行堆排序 */38 void HeapSort( SqList* L )39 {40 for( int i = L->length/2; i>0; i--) /* 把L中的r构建成一个大根堆 */41 HeapAdjust(L, i, L->length);42 43 for( int i = L->length; i>1; i--)44 { 45 swap(L, 1, i); /* 将堆顶记录和当前未经排序子序列的最后一个记录交换 */46 HeapAdjust(L, 1, i-1); /* 将L->r[1..i-1]重新调整为大根堆 */47 }48 }
排序算法_HeapSort
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。