采用分治思想:
https://www.cnblogs.com/chengxiao/p/6194356.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* @brief 主要是利用递归让两边均满足有序序列,然后再讲两个有序的序列排序放在在一个临时数组中
* @param arr
* @param left
* @param right
* @param temp
*/
void sort(int arr[],int left,int right,int temp[])
{ int mid=0;
if(left<right){
mid=(left+right)/2;
/*使两边都是排好序的*/
sort(arr,left,mid,temp);
sort(arr,mid+1,right,temp);
/*将两边排好序的进行合并*/
merge(arr,left,mid,right,temp);
}
}
/**
* @brief merge(分治思想)
* @param arr
* @param left
* @param right
* @param temp
*/
void merge(int arr[],int left,int mid,int right,int temp[])
{
int i=left;
int j=mid+1;
int t=left;//临时下标
while(i<=mid&&j<=right){
if(arr[i]<arr[j]) {
temp[t++]=arr[i++];
}else{
temp[t++]=arr[j++];
}
}
/*将左右两边的剩下的数据放到临时数组中*/
while(i<=mid){
temp[t++]=arr[i++];
}
while(j<=right){
temp[t++]=arr[j++];
}
//把temp中的内容拷给arr数组中
//进行归并的时候,处理的区间是arr[left,right),对应的会把
//这部分区间的数组填到tmp[left,right)区间上
/*将temp中的元素全部拷贝到到原来的数组z*/
memcpy(arr+left,temp+left,sizeof(int)*(right-left+1));
// t=0; //和上面等价
// while(left <= right){
// arr[left++] = temp[t++];
// }
}
int main()
{
int arr[]={3,2,1};
int len=sizeof(arr)/sizeof(arr[0]);
int *temp=(int*)malloc(sizeof(int)*len);
printf("%d\n",sizeof(arr)/sizeof(int));
for(int i=0;i<sizeof(arr)/sizeof(int);i++){
printf("%d ",arr[i]);
}
printf("\n");
printf("after mergesort\n");
sort(arr,0,len-1,temp);
free(temp);
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
printf("%d ",arr[i]);
}
return 0;
}