主要思想是先把待排序的数据分成一组一组的, 先是一每个数据为一组,然后2组2组归并, 形成了新的几组, 每组的数据为多个,依次递归下去,最后得到有序的数据线性表
int main(int argc, char *argv[])
{
int i = 0;
int r[11] = {1,22,4,33,43,11,123,67,99,2};//测试的10个数据
Sort(r,0,9);
printf("\n");
for (i = 0; i < 10; i++)//将排序后的数据打印出来
{
printf("%d ", r[i]);
}
while(1);
return 0;
}
void Sort(int r[],int first, int last)//递归将数据分组和合并
{
int middle = 0;
if (first >= last)
return;
middle =(last + first) >> 1;
Sort(r, first, middle);//0 4 | 0 2 | 0 1|
Sort(r,middle + 1, last);
OneSort(r,first,middle,last);//合并(对2组数据进行比较 归并)
}
void OneSort(int r[], int first, int middle, int last)对每组数据进行排序
{
int i = first, j = middle + 1, k = first;
int r1[10] = {0};//中间数据存储,有待解决
while (i <= middle && j <= last)
{
if (r[i] <= r[j])
r1[k++] = r[i++];
else
r1[k++] = r[j++];//将待合并2组按从小到大的顺序放到中间数据存储中
}
if (i <= middle)
{
while (i <= middle)
r1[k++] = r[i++];
}
else if (j <= last)
{
while(j <= last)
r1[k++] = r[j++];
}
for (i = first; i < last + 1; i++)//将一次和并的结果保存到初始数组中
r[i] = r1[i];
}