二路归并排序

主要思想是先把待排序的数据分成一组一组的, 先是一每个数据为一组,然后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];

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值