#include <stdio.h>
//合并算法
void merge_sort_recursive(int arr[],int start,int end,int reg[])
{
if(start >= end) return;
int len = end - start;//数组长度
int mid = (len >> 1) + start ;
int start1 = start;
int end1 = mid;
int start2 = mid + 1;
int end2 = end;
//一半
merge_sort_recursive(arr,start1,end1,reg);
//另一半
merge_sort_recursive(arr,start2,end2,reg);
int k =start;
//合并
while(start1 <= end1 && start2 <= end2){
if(arr[start1] < arr[start2]){
reg[k++] = arr[start1++];
}else{
reg[k++] = arr[start2++];
}
}
//把剩余的复制到reg
while(start1 <= end1){
reg[k++] = arr[start1++];
}
while(start2 <= end2){
reg[k++] = arr[start2++];
}
//把原来的arr覆盖一下
//printf("start=%d,end=%d:\n");
for(k = start;k<= end;k++){
arr[k] = reg[k];
printf("k=%d reg[k]=%d ",k,reg[k]);
}
printf("\n");
}
void merge_sort(int arr[],int len)
{
int reg[len];
merge_sort_recursive(arr,0,len -1,reg);
//int i;
//for(i = 0;i< len;i++){
// printf("%d ",reg[i]);
//}
printf("\n");
}
int min(int x,int y)
{
return x < y ? x : y;
}
//迭代法
void merge_sort(int arr[],int len)
{
int sed,start;
int *b = (int*)malloc( len * sizeof(int));
int *a = arr;
for(sed = 1;sed<len;sed +=sed){ //合并数组的长度
//合并的循环
for(start = 0;start < len;start += sed * 2){//处理2个数的队列,4个数的队列,8个数的队列
int low = start;
int mid = min(start + sed,len);
int high = min(start + sed * 2,len);
int start1 = low;
int end1 = mid;
int start2 = mid;
int end2 = high;
int k = low;
while(start1 < end1 && start2 < end2){
if(a[start1] < a[start2]){
b[k++] = a[start1++]
}else{
b[k++] = a[start2++];
}
}
while(start1 < end1){
b[k++] = a[start1++];
}
while(start2 < end2){
b[k++] = a[start2];
}
}
int* tem = a;
a = b; //将已经排好二个元素的序列赋值给a,继续下一次合并
b = a;
}
if(a != arr){ //那么a指向B b指向arr
int i;
for(i = 0;i<len;i++){
b[i] = a[i]
}
b = a;
}
free(b);
}
int main()
{
int arr[10];
int i;
for(i =0;i<10;i++){
if(i%2)
arr[i] = i + 2;
else
arr[i] = i - 2;
}
for(i = 0;i<10;i++){
printf("%d ",arr[i]);
}
printf("\n排序之后的:\n");
merge_sort(arr,10);
for( i =0;i<10;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}