先直接给出代码:数组
#include <stdio.h> #include <stdlib.h> #include <string.h> void mergeArray(int *a,int left,int mid,int right,int *tmp){ int i = left,m = mid,j = mid+1,n = right; int k = 0; //从两个数组中各取出一个数值,进行比较 while(i <= m && j <= n){ if(a[i] <= a[j]){ tmp[k++] = a[i++]; }else{ tmp[k++] = a[j++]; } } //将剩余的值赋值给临时数组 while(i <= m){ tmp[k++] = a[i++]; } while(j <= n){ tmp[k++] = a[j++]; } //将临时数组复制到目标数组 for(i = 0; i < k; i++){ a[left + i] = tmp[i]; } } void mergeSort(int *a,int left, int right,int *tmp){ if(left < right){ int mid = (left+right)/2; mergeSort(a,left,mid,tmp); mergeSort(a,mid+1,right,tmp); mergeArray(a,left,mid,right,tmp); } } int main(){ int a[] = {3,6,7,5,4,3,8,9,3}; int b[sizeof(a)/sizeof(int)]; mergeSort(a,0,sizeof(a)/sizeof(int) - 1,b); for(int i = 0; i < sizeof(a)/sizeof(int); i++){ printf("%d\n", a[i]); } return 0; }
给出归并排序的过程:
1.将一个数组按照每一次分两个数组,子数组也像这样同样分下去,直到数组中只剩下了一个元素code
2.根据第一步的结果,从左右两个数组中,分别在选出一个数据,比较她们的大小,将比较小的写入到目标数组中,直到其中的一方没有了数据,而后将另外一方加在数据的后面排序