您的位置:首页 > 其它

归并排序

2016-02-05 19:32 225 查看
基本思想:将待排序元素分成大小大致相同的2个子集合,

分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

#include <iostream>

using namespace std;

int a[100],b[100];

/*参数的传递是将实参的值赋给形参。
*然而对于数组来说却是一个例外,
*因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,
*所以数组作为参数传递给函数的只是数组首元素的地址,
*函数在需要用到后面元素时再按照这个地址和数组下标去查找。
*/
void Merge(int c[],int d[],int l,int m, int r)
{
//合并c[1:m]和c[m+1:r]到d[l,r]
int i = l, j = m+1, k = l;
while(i <= m && j <= r)   //两表中元素比较,类似于打擂台,大的复制到临时数组中
{
if(c[i] < c[j])
{
d[k++] = c[i++];
}
else
{
d[k++] = c[j++];
}
}

//若前一个子序列剩余,则直接复制入临时数组
if(i > m)
{
for(int q = j; q <= r; q++)
d[k++] = c[q];
}
//后一个子序列
else
{
for(int q = i; q <= m; q++)
d[k++] = c[q];
}
}

void Copy(int a[],int b[],int left,int right)
{
for(int i = left; i <= right; i++)
a[i] = b[i];
}

void MergeSort(int a[],int left,int right)
{
if(left < right)   //至少有两个元素,也是递归的结束条件
{
int i = (left + right)/2;
MergeSort(a,left,i);
MergeSort(a,i+1,right);
Merge(a,b,left,i,right);  //合并到临时数组b
Copy(a,b,left,right);      //复制回数组a
}
}

int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
MergeSort(a,0,n-1);
for(int i = 0; i < n; i++)
{
cout << a[i] << " ";
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: