#include <stdio.h>
#include <stdlib.h>
#define MAX 999999 //一个比所传入最大值要大的数即可
void Sort(int* a, int* temp, int low, int high);
void GuiBing(int* a, int* temp, int low, int high);
int main(void)
{
int num;
int i;
scanf("%d", &num);
int* temp = (int*)malloc(sizeof(int)*num);
int* a = (int*)malloc(sizeof(int)*num);
for (i = 0; i <= num - 1; i++) {
scanf("%d", &(a[i]));
}
Sort(a, temp, 0, num-1);
for (i = 0; i <= num - 1; i++) {
printf("%d ", a[i]);
}
return 0;
}
void Sort(int* a, int* temp, int low, int high) //Sort可以把传入的数组段排序
{
int len = high - low + 1;
if (len <= 1) {
return;
}
else {
Sort(a, temp, low, low + len / 3);
Sort(a, temp, low + len / 3 + 1, low + len * 2 / 3);
Sort(a, temp, low + len * 2 / 3 + 1, high);
GuiBing(a, temp, low, high);
return;
}
}
void GuiBing(int* a, int* temp, int low, int high)
{
int m, posi, i, j, len = high - low + 1, k;
m = MAX;
for (j = 1, k = low; j <= len; j++, k++) { //把两个子数组归并成一个子数组,存入temp
for (i = low; i <= high; i++) { //网上多是分别从两个子数组头开始找,但其实没那么复杂,直接不断寻找最小数就行了!
if( a[i] < m ) {m = a[i]; posi = i; }
}
a[posi] = MAX;
temp[k] = m;
m = MAX;
}
for (i = low; i <= high; i++) { //将temp复制到原有的数组a
a[i] = temp[i];
}
}
归并排序-拓展至三路归并
最新推荐文章于 2022-08-04 21:04:50 发布