C语言归并排序
/*归并排序时间复杂度为O(nlogn)
*用到递归、分治思想。
2021.9.17
*/
#include <stdio.h>
#define ArrLen 20
//打印数组
void printList(int arr[],int len)
{
int i;
for (i=0;i<len;i++){
printf("%d\t",arr[i]);
}
}
//合并左右两部分已经排好顺序的待排数组为一个result数组
void merge(int arr[],int start,int mid,int end)
{ //arr:待排数组,start、mid、end 为待排数组的始、中、尾下标
int result[ArrLen]; //定义result数组
int k=0; //result数组元素的下标
int i=start;
int j=mid+1;
while (i<=mid && j<=end)
{//当左右数组没有比较结束时
if (arr[i]<arr[j])
{
result[k++]=arr[i++];//赋值到result数组,k、i均后移一位
}
else
{
result[k++]=arr[j++];
}
}
//当左右数组比较完毕,直接将剩余数组的数按顺序填到result数组中
if (i == mid+1){
while (j<=end){
result[k++]=arr[j++];
}
}
if (j == end+1){
while(i<=mid){
result[k++]=arr[i++];
}
}
//将result数组赋给原数组,覆盖其原有值
for (j=0,i=start;j<k;i++,j++){
arr[i]=result[j];
}
}
//递归地将一个大数组从中间分为两个小数组直到小数组元素个数为一,并排序
void mergeSort(int arr[],int start,int end)
{
//递归结束条件,数组中只有一个数
if (start>=end)
return;
int mid=(start+end)/2;
mergeSort(arr,start,mid);
mergeSort(arr,mid+1,end);
merge(arr,start,mid,end);
}
int main()
{
int arr[]={4,7,6,5,2,1,8,9,2,1};
mergeSort(arr,0,9);
printList(arr,10);
return 0;
}