概念:把数组分割成两个相同大小的子数组,对两个数组进行排序,然后再将他们合并成一个数组。对于有奇数个元素的数组,这个算法创建两个子数组,其中一个要比另一个多一个元素。
#include "stdio.h" #include "stdlib.h" #include "time.h" #define SIZE 10 void mergeSort(int arr[],int low,int high); void merge(int arr[],int low,int high,int low2,int high2); int main(void) { int loop,temp; int arr[SIZE]; srand(time(NULL)); printf("The Arrary before merge sort: "); for(loop = 0; loop < SIZE; loop++){ temp = rand()%99 + 1; printf("%d ",temp); arr[loop] = temp; } mergeSort(arr,0,SIZE-1); printf(" The array after merge sort: "); for(loop=0;loop < SIZE; loop++){ printf("%3d",arr[loop]); } getchar(); return 0; } void mergeSort(int arr[],int low,int high) { int middle; if((high -low) >= 1){//当数组中的元素大于等于两个时分割子数组,然后归并 middle = (low + high) /2; mergeSort(arr,low,middle); mergeSort(arr,middle+1,high); merge(arr,low,middle,middle+1,high); } } void merge(int arr[],int low,int high,int low2,int high2) { int i=low,j=low2,k=low,loop; int temp[SIZE]; while(i <= high && j<=high2){//相互比较,把小的元素放入临时数组temp中 if(arr[i] <= arr[j]){ temp[k++] = arr[i++]; }else{ temp[k++] = arr[j++]; } } if(i == low2){//右数组还有元素 while(j <= high2){ temp[k++] = arr[j++]; } }else{//做数组还有元素 while(i <= high){ temp[k++] = arr[i++]; } } for(loop=low;loop <= high2; loop++){//把临时数组的元素复制到arr中 arr[loop] = temp[loop]; } }