归并排序与堆排序
2012-04-10 11:21
246 查看
#include <iostream> using namespace std; // 归并排序 void Merge(int a[],int b[],int i,int m,int n) { int j,k; for(j = m+1,k=i;i<=m&&j<=n;k++) { if(a[i] < a[j]) b[k] = a[i++]; else b[k] = a[j++]; } if(i<=m) for(int p=i;p<=m;p++,k++) b[k] = a[p]; if(j<=n) for(int p=j;p<=n;p++,k++) b[k] = a[p]; } void copyArray(int a[],int b[],int s,int e) { for(int i = s;i<=e;i++) b[i] = a[i]; } void Merge_Sort(int a[],int b[],int s,int t) { if(s == t) b[s] = a[s]; else{ int m = (s + t)/2; Merge_Sort(a,b,s,m); Merge_Sort(a,b,m+1,t); Merge(b,a,s,m,t); copyArray(a,b,s,t); // 减少一个中间数组的空间开销 } } void main() { int a[10] = {5,4,3,2,-1,9,10,15,8,6}; int b[10]; Merge_Sort(a,b,0,9); for(int i=0;i<10;i++) cout << a[i] << endl; }
#include <iostream> #include <algorithm> using namespace std; // 大顶堆排序 void HeapAdjust(int a[],int p,int size) { int lchild = 2*p; int rchild = 2*p+1; int max = p; if(p<=size/2) { if(a[max] < a[lchild] && lchild <=size) max = lchild; if(a[max] < a[rchild] && rchild <=size) max = rchild; if(max != p) { swap(a[max],a[p]); HeapAdjust(a,max,size); } } } void HeapSort(int a[],int s,int size) { // 建堆 for(int i=size/2;i>=s;i--) HeapAdjust(a,i,size); // 调整 for(int i=size;i>=s;i--) { swap(a[s],a[i]); HeapAdjust(a,s,i-1); } } void main() { int a[]= {5,1,4,3,2,-1,9,10,-15,19,20}; HeapSort(a,1,10); for(int i=1;i<=10;i++) cout << a[i] << endl; }
与书上的代码有点差别,个人理解的差别吧...
相关文章推荐
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 三大排序算法(快速排序,归并排序,堆排序)
- 排序总结:堆排序、快速排序、归并排序、基数排序
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 练习《算法导论》之排序:插入排序,归并排序,堆排序,快速排序
- 常用排序算法——插入排序,快速排序,归并排序,堆排序,计数排序
- 快排、归并排序(分治)、堆排序
- 归并排序、快速排序、堆排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 排序之选择排序、堆排序、归并排序、快速排序
- 归并排序和堆排序
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)
- 菜鸟学习历程【15-6】堆排序、归并排序、基数排序
- 快速排序、堆排序、归并排序比较
- python排序算法-冒泡排序,选择排序,直接插入排序,希尔排序,归并排序,快速排序,堆排序
- 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
- 排序算法思想——归并排序、堆排序、shell排序
- 归并排序,堆排序,快排的简单实现
- 冒泡排序,快速排序,归并排序,选择排序,插入排序,堆排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结