归并排序
“归并”含义:将两个或两个以上的有序表组合成一个新的有序表。
一般使用的排序方法称为2-路归并排序。
含义:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到(n/2向上取整)个长度为2或1的有序子序列;再两两归并,....,如此重复,直至得到一个长度为n的有序序列为止。
给出书上示例看得更清楚:
代码仍然出自:http://blog.csdn.net/ns_code/article/details/20306991学习了!
这里代码中用到了一个一维数组用来存放每次归并操作结束后的序列。
仍然手敲一遍,只有细微地方略有不同。
#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;
}