思想:二分法,类似于二叉树的形式,不断的拆分,知道每个部分的个数为1,然后返回到根元素,进行排序。
#include <stdio.h>
//合并子序列
void merge(int array[], int start, int mid, int end)
{
int len_l = mid - start + 1; // 左子串长度
int len_r = end - mid; //右子串长度
int len = 0, len_max = 0; //len:两个字串小值,len_max:两子串长度之和
int l = start, r = mid + 1; //l:左子串遍历,r:右子串遍历
int m = 0; //局部变量数组索引
//获取两个子串较小值
if(len_l > len_r)
{
len = len_r;
}
else
{
len = len_l;
}
len_max = end - start + 1;
int array_t[len_max];
for(m = 0; len_r != 0 && len_l != 0; m++)
{
//取两子串的小值保存
if(array[l] < array[r])
{
array_t[m] = array[l];
l++;
len_l--;
}
else
{
array_t[m] = array[r];
r++;
len_r--;
}
}
//其中一条子串为0,则需要将另一条子串的剩余部分连接到局部数组中
if(len_l == 0)
{
while(len_r)
{
array_t[m++] = array[r++];
len_r--;
}
}
else if(len_r == 0)
{
while(len_l)
{
array_t[m++] = array[l++];
len_l--;
}
}
//将局部数组的值拷贝到原数组
for(m = 0; m < len_max; m++)
{
array[start + m] = array_t[m];
}
}
//拆分子序列
void split(int array[], int start, int end)
{
int i = 0, j = 0;
int mid;
if(start == end)
{
return;
}
else
{
mid = start + (end - start) / 2;
//拆分成两条子串
split(array, start, mid);
split(array, mid + 1, end);
//按顺序合并
merge(array, start, mid, end);
}
return;
}
int main()
{
int array[8] = {3, 41, 52, 26, 38, 57, 9, 49};
split(array, 0, 7);
int i = 0;
for(i = 0; i < 8; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}