归并排序( 时间复杂度O(n*logn) )
采用 递归思想,函数 mergesort(int a[ ],int s,int e,int temp[ ]),下标从 s 到 e,排序数组a[ ]。其方法是将a[ ]分成两半,排序前一半,排序后一半,然后用函数 merge() 将其两部分按顺序合并成一个有顺序的数组;而a[ ]的前后两部分又可继续递归使用 mergesort() 进行排序。
代码如下:
#include <stdio.h>
int a[10] = {13,27,19,2,8,12,2,8,30,89}; //待排序数组
int b[10]; //存放临时数据
void mergesort(int a[],int s,int e,int temp[]); //排序数组a[],下标从 s 到 e
void merge(int a[],int s,int m,int e,int temp[]); //合并数组a[],下标 s -> m, m+1 -> e
void mergesort(int a[],int s,int e,int temp[]){
if(s < e){
int m = s + (e-s)/2; //不写成 (s+e)/2,防止(s+e)数组大于int类型范围,而(s+e)/2还未超过int类型范围
mergesort(a,s,m,temp); //排序数组a[]前一半,s -> m
mergesort(a,m+1,e,temp); //排序数组a[]后一半,m+1 -> e
merge(a,s,m,e,temp); //按顺序合并这两部分
}
}
void merge(int a[],int s,int m,int e,int temp[]){
int p = 0;
int p1 = s,p2 = m + 1; //p1指向 a[s] -> a[m],p2指向 a[m+1] -> a[e]
while(p1 <= m && p2 <= e){
if(a[p1] < a[p2])
temp[p++] = a[p1++];
else
temp[p++] = a[p2++];
}
while(p1 <=m)
temp[p++] = a[p1++];
while(p2 <= e)
temp[p++] = a[p2++];
for(int i = 0;i <= e - s;i++) //合并结果存到数组a[]中
a[s + i] = temp[i];
}
int main(void){
int size = sizeof(a) / sizeof(a[0]);
mergesort(a,0,size - 1,b);
for(int i = 0;i < size;i++){
printf("%4d",a[i]);
}
putchar('\n');
system("pause");
return 0;
}