先直接给出代码:
#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.将一个数组按照每一次分两个数组,子数组也像这样一样分下去,直到数组中只剩下了一个元素
2.根据第一步的结果,从左右两个数组中,分别在选出一个数据,比较她们的大小,将比较小的写入到目标数组中,直到其中的一方没有了数据,然后将另一方加在数据的后面
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。