合并排序
/*合并排序*/
#include <stdio.h>
#include <malloc.h>
#include <limits.h>
void merge(int a[], const int indexStart, const int indexMid, const int indexEnd){
int i;
int sizea1 = indexMid-indexStart+2;
int sizea2 = indexEnd-indexMid+1;
int *a1 = (int*)malloc(sizeof(int)*sizea1);
int *a2 = (int*)malloc(sizeof(int)*sizea2);
//将原数组均分为两个数组,并在结尾设立哨兵
for(i=0; i<sizea1-1; i++){
a1[i] = a[indexStart+i];
}
a1[sizea1-1] = INT_MAX;
for(i=0; i<sizea2; i++){
a2[i] = a[indexMid+i+1];
}
a2[sizea2-1] = INT_MAX;
//设定数组的初始数组
int index1 = 0;
int index2 = 0;
for(i=0; i<sizea1+sizea2-2; i++){
if(a1[index1]>a2[index2]){
a[i+indexStart] = a2[index2];
index2++;
}else{
a[i+indexStart] = a1[index1];
index1++;
}
}
}
void merge_sort(int a[], int indexStart, int indexEnd){
//若分解为长度为1的数组,则不再进行分解
if( indexEnd-indexStart==0 ){
return;
}else{
int indexMid = (indexStart+indexEnd)/2;
//将原数组分解为两个数组
merge_sort(a, indexStart, indexMid);
merge_sort(a, indexMid+1, indexEnd);
//对两数组进行排序
merge(a, indexStart, indexMid, indexEnd);
}
}
int main(int argc, char** argv){
int a[] = {5,2,4,7,1,3,2,6,0};
int i;
int length = sizeof(a) / sizeof(a[0]);
//显示原数组排列顺序
printf("原始排列是:\n");
for(i=0; i<length; i++) {
printf("%d ", a[i]);
}
printf("\n");
merge_sort(a, 0, length-1);
//显示排序结果
printf("排列后是:\n");
for(i=0; i<length; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}