算法竞赛入门经典:第八章 高效算法设计 8.2归并排序

来源:互联网 发布:淘宝客服如何建议 编辑:程序博客网 时间:2024/05/29 17:20
/*归并排序:1 注意每次划分时候使用一个辅助数组输入:81 9 6 3 4 7 9 0输出:0 1 3 4 6 7 9 9*//*关键:1 void mergeSort(int* iArr,int low,int high,int* iTempArr)//注意,high是取不到的,因此传入的实参为数组长度n2 if(high - low > 1)//递归出口,所剩元素大于1,只有一个元素没有必要排序,递归入口一般是:low < high,所剩元素大于1个3 int mid = low + (high - low) / 2;//分治第一步,划分,技巧,向中间节点靠拢4 int l = low,m = mid,i = low;//l,m分别作为排序时的下标,而i是作为临时数组的下标5 mergeSort(iArr,low,mid,iTempArr);//分治第二部,递归求解6 if(m >= high || (l < mid && iArr[l] <= iArr[m]))//如果右边已经排好 或者 左边没排好(易漏,如果左边已经排好,就会数组越界) 并且左边小于等于右边7 for(int j = low ; j < high; j++)//注意,这里由于high取不到,因此用j<high*/#include <stdio.h>#include <stdlib.h>#define MAXSIZE 1024void mergeSort(int* iArr,int low,int high,int* iTempArr)//注意,high是取不到的,因此传入的实参为数组长度n{if(high - low > 1)//递归入口,所剩元素大于1,只有一个元素没有必要排序{int mid = low + (high - low) / 2;//分治第一步,划分,技巧,向中间节点靠拢int l = low,m = mid,i = low;//l,m分别作为排序时的下标,而i是作为临时数组的下标mergeSort(iArr,low,mid,iTempArr);//分治第二部,递归求解mergeSort(iArr,mid,high,iTempArr);while(l < mid || m < high){if(m >= high || (l < mid && iArr[l] <= iArr[m]))//如果右边已经排好 或者 左边没排好(易漏,如果左边已经排好,就会数组越界) 并且左边小于等于右边{iTempArr[i++] = iArr[l++];}else{iTempArr[i++] = iArr[m++];}}for(int j = low ; j < high; j++)//注意,这里由于high取不到,因此用j<high{iArr[j] = iTempArr[j];}}}void print(int* iArr,int n){for(int i = 0 ; i < n; i++){if(i){printf(" %d",iArr[i]);}else{printf("%d",iArr[i]);}}printf("\n");}void process(){int n;while(EOF != scanf("%d",&n)){int iArr[MAXSIZE];int iTempArr[MAXSIZE];for(int i = 0 ; i < n ; i++){scanf("%d",&iArr[i]);}mergeSort(iArr,0,n,iTempArr);print(iArr,n);}}int main(int argc,char* argv[]){process();system("pause");return 0;}

1 0