您的位置:首页 > 其它

归并排序与堆排序

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;
}


与书上的代码有点差别,个人理解的差别吧...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐