归并排序代码
//递归排序 #include<stdio.h> #include<stdlib.h> //归并排序-合并 void merge(int arr[],int tempArr[],int left,int mid,int right) { //标记左边未排序的元素 int l_pos=left; //标记右边未排序的元素 int r_pos=mid+1;//从中间分组右边第一个是中间位置+1 int pos=left; //开始合并 while(l_pos<=mid&&r_pos<=right) { if(arr[l_pos]<arr[r_pos]) tempArr[pos++]=arr[l_pos++]; else tempArr[pos++]=arr[r_pos++]; } //合并左边剩余的元素 while(l_pos<=mid) {tempArr[pos++]=arr[l_pos++];}//用于右边数据比对完后,跳出了上一个循环,左边数据未放入的问题 while(r_pos<=right) { tempArr[pos++]=arr[r_pos++]; } while(left<=right) { arr[left]=tempArr[left]; left++; } } //归并排序-分治 void msort(int arr[],int tempArr[],int left,int right) { if(left < right)//表示数组下标,左边小于右边时才表示有两个以上的数据 { //先找中间点 int mid = (left+right)/2; //开始划分左半区 msort(arr,tempArr,left,mid); //开始划分右半区 msort(arr,tempArr,mid+1,right); //开始进行合并操作 merge(arr,tempArr,left,mid,right); } //全是递归调用 } void merge_sort(int arr[],int n) { //分配一个辅助函数 int *tempArr=(int *)malloc(n *sizeof(int)); if(tempArr) { msort(arr,tempArr,0,n-1); free(tempArr); } else { printf("空间申请错误!"); } } int main(int argc,char const *argv[]) { int arr[]={9,5,2,7,12,4,3,1,11}; int n=9; for(int i=0;i<n;i++) { printf("%3d",arr[i]); } merge_sort(arr,n); printf("\n"); for(int i=0;i<n;i++) { printf("%3d",arr[i]); } }