排序之归并排序

咳咳,排序算法到了归并排序就比较高级了,思想也就没有那么暴力了;
归并排序其实是利用了分治思想和递归思想。
主要思想
把等待排序的数列从中间那个数(其实不一定要中间)切断(二分嘛),变成两个数列,把这两个数列再分别从中间切断,一直切切切,直到每个数列只剩一个数,然后开始合并,把两个无序数列合并成一个有序数列,然后再把这个新数列去和别的数列合并,合并合并合并最终合并成为一个数列,这个数列就排好序了昂。
好下面我们来讲怎么合并:
这个口胡不好解释,我们举个栗子
一串数 { 2 4 7 9 } { 1 3 6 8}
假设这是归并排序中某两个要合并的数列。(注意左右两边肯定也是有序的,因为左右两边的数列也是归并而成的,经过之前的合并时已经排好序了)
开始排列,借助辅助数组 p
逐一比较,2和1,1小,1进数组。2和3比较,2小,2进数组。3和4比,3小,3进数组。4和6比较,4小,进数组。6和7比较,6小,进数组。7和8比较,7小,进数组。8在和9比较,8小,进去。最后剩下的9肯定是最大的,进数组。
根据进数组的顺序为 1 2 3 4 6 7 8 9
是不是就排好序了。
模板如下:
a是排序数组,b是辅助数组;
void guibin(int st,int end)//排序的起点和终点
{
if(st==end)//判特殊,起点终点一样还排个毛啊
return;
int mid=(st+end)/2;//取中间值,切断;
guibin(st,mid);//递归不断切断;
guibin(mid+1,end);
int i=st,j=mid+1,k=st;
while(i<=mid&&j<=end) //比较啊啊啊
{
if(a[i]>a[j])
b[k++]=a[j++];
else
b[k++]=a[i++];
}
while(i<=mid)//如果一边的数都进入数组了,而另一边还有数剩下,不用比较了,剩下的肯定最大,直接进入数组。
{
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
for(int i=st;i<=end;i++)
{
a[i]=b[i];//最后再把辅助数组的复制给原数组;
}
}
雾草,现在都快11点了,我先睡了,明天再讲一下逆序对的问题。(归并顺便求逆序对,超简单)
end~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值