#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void merge(int array[], int min, int max, int temp[]); //递归
void mergesort(int a[], int first, int mid, int last, int temp[]); //合并交换排序
void Mergesort(int array[], int n); //创建临时内存空间
int main(void)
{
int array[SIZE] = { 43, 6, 3, 26, 2, 7, 2, 9, 5, 7 };
Mergesort(array, SIZE);
for (int n = 0; n < SIZE; n++) //打印排序完后的临时数组
printf("%d,", array[n]);
return 0;
}
void mergesort(int array[], int min, int mid, int max, int temp[]) {
int i = 0;
int left_begin = min; //25-28行是确定分割为两个小数组的元素范围
int left_end = mid; //前面的区间范围
int right_begin = mid + 1;
int right_end = max; //后面的区间范围
while (left_begin <= left_end&&right_begin <= right_end) { //判断比较大小,并赋给临时数组
if (array[left_begin] <= array[right_begin])
temp[i++] = array[left_begin++];
else
temp[i++] = array[right_begin++];
}
while (left_begin <= left_end) //把上面还没循环完毕的数组,中剩下的元素直接取出放入temp数组
temp[i++] = array[left_begin++];
while (right_begin <= right_end)
temp[i++] = array[right_begin++];
for (int n = 0; n < i; n++) //把排序好临时的值再放回原先数组中
array[min+n] = temp[n];
}
void merge(int array[], int min, int max, int temp[]) {
if (min < max){ //这里不理解可以用VS2013看,设置断点,然后启动调试->窗口,把局部变量之类的窗口调出来,一看就明白
int mid = (min + max) / 2;
merge(array, min, mid, temp);
merge(array, mid + 1, max, temp);
mergesort(array, min, mid, max, temp);
}
}
//创建临时数组
void Mergesort(int array[], int n){
int *p = (int*)malloc(SIZE*sizeof(int));
if (p != NULL){
merge(array, 0, SIZE - 1, p);
free(p);
}
else
printf("sorry,please debug");
}
热烈欢迎各种批评、指正、讨论,经常在线
并归排序
最新推荐文章于 2024-04-04 19:25:28 发布