算法练习:堆排序
2014-09-13 21:58
162 查看
C++代码 1:
C++代码 2 :用递归方式实现调整堆
#include <iostream> #include <assert.h> using namespace std; //调整堆 //s:需要调整的非终端节点的位序 //len:整个待排序数组的长度 void HeapAdjust(int a[], int s, int len) { int tmp = a[s]; for(int i=s*2; i<=len; i=i*2) { int largeIndex = i; if(i+1 <= len && a[i+1] > a[i]) { largeIndex = i+1; } if(tmp < a[largeIndex]) { a[s] = a[largeIndex]; s = largeIndex; } } a[s] = tmp; } void HeapSort(int a[], int len) { //构建大根堆 for(int i=len/2; i>=1; i--) { HeapAdjust(a, i, len); } //堆排序 for(int i=len; i>=1; i--) { //交换每次调整后的堆的相应的第一个元素和最后一个元素 int tmp = a[i]; a[i] = a[1]; a[1] = tmp; HeapAdjust(a, 1, i-1); } } int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列 //首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素) { int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0" int len = sizeof(a) / sizeof(int); cout << "----original----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; HeapSort(a, len-1); cout << "----result----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; cin.get(); cin.get(); return 0; }
C++代码 2 :用递归方式实现调整堆
#include <iostream> #include <assert.h> using namespace std; //调整堆 //s:需要调整的非终端节点的位序 //len:整个待排序数组的长度 void HeapAdjust(int a[], int s, int len) { int largeIndex = s; int leftChildIndex = 2*s; if(leftChildIndex<=len && a[s]<a[leftChildIndex]) { largeIndex = leftChildIndex; } int rightChildIndex = 2*s + 1; if(rightChildIndex<=len && a[s]<a[rightChildIndex] && a[leftChildIndex]<a[rightChildIndex]) { largeIndex = rightChildIndex; } if(largeIndex != s) { int tmp = a[largeIndex]; a[largeIndex] = a[s]; a[s] = tmp; //用递归方式实现调整堆 HeapAdjust(a, largeIndex, len); } } void HeapSort(int a[], int len) { //构建大根堆 for(int i=len/2; i>=1; i--) { HeapAdjust(a, i, len); } //堆排序 for(int i=len; i>=1; i--) { //交换每次调整后的堆的相应的第一个元素和最后一个元素 int tmp = a[i]; a[i] = a[1]; a[1] = tmp; HeapAdjust(a, 1, i-1); } } int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列 //首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素) { int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0" int len = sizeof(a) / sizeof(int); cout << "----original----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; HeapSort(a, len-1); cout << "----result----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; cin.get(); cin.get(); return 0; }
相关文章推荐
- [算法练习]堆排序的C语言实现
- 蓝桥杯练习: 算法训练 矩阵乘法
- 算法(Algorithms)第4版 练习 1.3.15
- 【Python排序搜索基本算法】之堆排序
- 算法——排序(六)堆排序
- 算法练习--二分搜索哈希表-JS 实现
- 算法(Algorithms)第4版 练习 1.3.32
- 2018年全国多校算法寒假训练营练习比赛(第一场)G - 圆圈(分形)
- 2018年全国多校算法寒假训练营练习比赛(第四场)-E:通知小弟(SCC缩点)
- 数据结构与算法之堆与堆排序
- 蓝桥杯练习系统习题-算法训练5
- 每周算法练习——最近对问题
- 每日算法练习之下落的小球
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- java中的排序算法——简单选择排序,树形选择排序与堆排序(一)
- 2018年全国多校算法寒假训练营练习比赛(第三场)F
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 2018年全国多校算法寒假训练营练习比赛(第三场) A
- 2018年全国多校算法寒假训练营练习比赛(第三场)题解
- 【算法导论】第六章 再谈 堆排序和最大优先级队列