归并排序
1.算法描述
归并排序的思想,在之前我们也都已经遇到过了,就是将一个完整的无序的序列,变成两个无序的序列,同时对左右两个无序序列进行排序,最终,对两个序列进行合并,最后我们可以就可以得到一个有序的序列。分别对左右两边进行排序的话,我们可以采用递归的算法。关键的问题在于如何进行合并。
2.算法实现&&描述
#include <stdio.h>
void merge(int *(number),int *ST,int left,int mid,int right)//实现合并
{
int i = left;
int j = mid + 1;
int oi = left;
for(i,j;i<=mid&&j<=right;left++)
{
if(ST[i]>ST[j])//比较左右两边的值
{ //因为两边都是有序的,那我们只需要从有序的数组中取最小的元素赋给原数组
number[left] = ST[j++];
}
else
{
number[left] = ST[i++];
}
}
if(i<=mid)//将剩下的辅助数组中的其他元素赋给原数组
{
while(left<=right)
{
number[left] = ST[i];
i++;
left++;
}
}
if(j<=right)
{
while (left<= right)
{
number[left] = ST[j];
j++;
left++;
}
}
for(int i=oi;i<=right;i++)
{
ST[i] = number[i];//将合并后的值赋给辅助数组
}
return;
}
void merge_sort(int *number,int (*ST),int left,int right)//归并排序
{
if(left==right)
{
ST[left] = number[left];
}
else
{
int mid = (left+right)/2;
merge_sort(number, ST, left, mid);//左右分别进行归并排序
merge_sort(number, ST, mid + 1, right);
merge(number, ST, left, mid, right);//左右合并
}
}
int main()
{
//下面是测试内容
int maxn = 105;
int number[105];
int ST[105];
for(int i=1;i<=10;i++)
{
number[i] = 10 - i;
}
merge_sort(number, ST, 1, 10);
puts("");
for(int i=1;i<=10;i++)
{
printf("%d", number[i]);
}
//输出为0123456789
return 0;
}
书上的实现秀的我头皮发麻,一脸懵逼,与书上的思想基本上一致,只是增加了一个赋值给辅助数组的操作,我觉得这样比书上的更好理解.欢迎大家跟我讨论呀。?