归并排序,即通过递归,使左侧排好序,再使右侧排好序,最后使整体排好序。
使用归并排序对数组排序,代码练习如下:
#include <stdio.h>
#include <stdlib.h>
int mer_sort(int array[],int L,int R);
void merge(int array[],int L,int mid,int R);
int main(void)
{
int i;
int array1[9]={3,8,1,2,6,9,5,7,4};
mer_sort(array1,0,8);
for(i=0;i<9;i++)
{
printf("%d ",array1[i]);
}
return 0;
}
/* 让数组在L和R范围上有序*/
int mer_sort(int array[],int L,int R)
{
if(L==R)
{
return 0;
}
int mid=L+((R-L)>>1);
mer_sort(array,L,mid);
mer_sort(array,mid+1,R);
merge(array,L,mid,R);
}
void merge(int array[],int L,int mid,int R)
{
/*辅助数组*/
int help_array[R-L+1];
int i=0;
int p1=L;
int p2=mid+1;
/*左右两部分依次对比,值小的放辅助数组*/
while(p1<=mid&&p2<=R)
{
help_array[i++]=array[p1]<=array[p2]?array[p1++]:array[p2++];
}
/*没有越界的全部放如辅助数组*/
while(p1<=mid)
{
help_array[i++]=array[p1++];
}
while(p2<=R)
{
help_array[i++]=array[p2++];
}
for(i=0;i<(R-L+1);i++)
{
array[L+i]=help_array[i];
}
}
之所以归并排序的时间复杂度相对选择排序等方法更低,是因为充分利用了比较次数;选择排序等方法浪费了大量比较次数。