排序之归并排序

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4. 重复步骤3直到某一指针达到序列尾

5. 将另一序列剩下的所有元素直接复制到合并序列尾

归并排序代码如下:
#include< stdio.h>
#include< stdlib.h>
void merge(int *array,int p,int q,int r)
{
int i,j;
int n1=q-p+1;
int n2=r-q;
int k = p;
int *Larray = (int *)malloc(sizeof(int)*(n1+1));
int *Rarray = (int *)malloc(sizeof(int)*(n2+1));
for(i=0;i< n1;i++)
{
Larray[i]=array[p+i];
}
for(j=0;j< n2;j++)
{
Rarray[j]=array[q+j+1];
}
i = j = 0;
while( i < n1 && j < n2 )
{
if(Larray[i]<=Rarray[j])
{
array[k] = Larray[i];
   i = i + 1;
k++;
}
else
{
array[k] = Rarray[j];
   j = j + 1;
k++;
}
}

while(i < n1)
array[k++]=Larray[i++];
while(j < n2)
array[k++]=Rarray[j++];
free(Larray);
free(Rarray);
}

void mergesort(int *array,int p,int r)
{
int q;
if(p < r)
{
q = (p+r)/2;
mergesort(array,p,q);
mergesort(array,q+1,r);
merge(array,p,q,r);
}
}

int main()
{
int i;
int array[]={5,2,3,4,5,6,7,1,9};
int length=sizeof(array)/sizeof(array[0]);
printf("处理之前:\n");
for(i=0;i< length;i++)
{
printf("%d",array[i]);
}
printf("\n排序之后\n");
mergesort(array,0,length);
for(i=0;i< length;i++)
{
printf("%d",array[i]);
}
return 0;
}
时间复杂度:
最好O(nlogn);
最坏O(nlogn);
稳定性:稳定
posted @ 2014-04-01 10:28  dreamsyeah  阅读(104)  评论(0编辑  收藏  举报