C语言二分归并排序算法思想,二路归并排序算法实现-完整C语言程序(示例代码)...

/***********************************************************************************************

1.设定两个指针,最初位置分别为两个已经排序序列的起始位置

2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

3.重复步骤3直到某一指针达到序列尾

4.将另一序列剩下的所有元素直接复制到合并序列尾

归并排序:

归并排序具体工作原理如下(假设序列共有n个元素):

1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素

2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素

3.重复步骤2,直到所有元素排序完毕

归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.

何问起 hovertree.com

归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。

其主要算法操作可以分为以下步骤:

Step 1:将n个元素分成两个含n/2元素的子序列

Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)

Step 3:合并两个已排序好的序列

************************************************************************************************/#include#include#include#include#include#include#include#include#include#include

using namespacestd;void Random(int a[],intn)

{int i=0;

srand( (unsigned)time( NULL ) );while(i

{

a[i++]=rand();

}

}void merge(int *a, int low, int mid, int high) //归并操作

{intk, begin1, begin2, end1, end2;

begin1=low;

end1=mid;

begin2= mid + 1;

end2=high;int *temp = (int *) malloc((high - low + 1) * sizeof(int));for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序

{if(a[begin1] <=a[begin2])

temp[k]= a[begin1++];elsetemp[k]= a[begin2++];

}if(begin1 <= end1) //左剩

memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));else //右剩

memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));

memcpy(a+ low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组

free(temp); //释放空间

}void merge_sort(int *a, unsigned int begin, unsigned intend)

{intmid;if(begin

{

mid=begin+(end-begin)>>1;//mid = (end + begin) / 2; 防止数据加法溢出

merge_sort(a, begin, mid); //分治

merge_sort(a, mid + 1, end); //分治

merge(a, begin, mid, end); //合并两个已排序的数列

}

}intmain()

{int a[20];

Random(a,20);for(int i=0;i<20;i++)

{

cout<

}

merge_sort(a,0, 20-1);for(int i=0;i<20;i++)

{

cout<

}return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值