您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记-排序3

2014-05-30 08:41 337 查看

归并排序

“归并”含义:将两个或两个以上的有序表组合成一个新的有序表。

一般使用的排序方法称为2-路归并排序。

含义:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到(n/2向上取整)个长度为2或1的有序子序列;再两两归并,....,如此重复,直至得到一个长度为n的有序序列为止。

给出书上示例看得更清楚:



代码仍然出自:/article/1337332.html学习了!

这里代码中用到了一个一维数组用来存放每次归并操作结束后的序列。

仍然手敲一遍,只有细微地方略有不同。

#include<stdio.h>
#include<stdlib.h>

void Merge(int *, int *, int, int);
void MergeSort(int *, int *, int, int);
void MSort(int *,int);

void Merge(int *arr, int *brr, int start, int end)
{
//start,mid,end代表的是数组下标
int i,j,k,mid;
mid =(start+end)/2;
i = start;
j = mid+1;
k = 0;
while(i<=mid && j<=end)
{
if(arr[i]<=arr[j])
brr[k++] = arr[i++];
else
brr[k++] = arr[j++];
}

while(i<=mid)
brr[k++] = arr[i++];
while(j<=end)
brr[k++] = arr[j++];

/*for(i=0;i<k;i++)
arr[i+start] = brr[i];*/
for(i=start,k=0;i<=end;)
{
arr[i++] = brr[k++];
}

}

void MergeSort(int *arr, int *brr, int start, int end)
{
if(start<end)
{
int mid = (start+end)/2;
MergeSort(arr,brr,start,mid);
MergeSort(arr,brr,mid+1,end);
Merge(arr,brr,start,end);
}
}

void MSort(int *arr, int len)
{
int *brr = (int *)malloc(len*sizeof(int));
MergeSort(arr,brr,0,len-1);
free(brr);
brr = 0;
}

int main()
{
int i,arr[10] = {10,5,66,87,446,23,75,31,41,678};
MSort(arr,10);
for(i=0;i<10;++i)
printf("%d ",arr[i]);

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