排序2(快速排序,归并排序)

快速排序


思想
快排的核心思想便是分治,分治是将一个比较复杂庞大的问题分化成一个一个比较简单的子问题来分别处理的一种解题思路。
确定一个分界点,使得左边的数小于等于分界点,右边的数大于等于分界点。使得待排序列有序化。然后分别对左右子序列进行相同的操作,直到完成排序为止。
1. 确定分界点 
2. 调整范围 
3. 递归处理左右俩子段

算法描述
1、确定函数的结束条件(即当数组元素只有一个或者没有元素,那就结束递归)。
2、确定分界点(一般情况是以左边第一个的值为分界点,即q,当然以任意方式选取分界点都是可以的)。
3、调整范围,使得右半边的数都大于等于分界点值,左半边的数都小于等于分界点的值
4、重复执行1~3(递归)操作,直到完成排序

a2dcc9247e3746b198f125cf40547aea.gif

 


模板

void quickSort(int q[], jnt l, int r)
{
    //递归结束条件
    if (1 >= r) return;
    //确定分界点
    int x=q[l], i=l -1, j=r + 1;
	//划分范围
    while (i<j){
	    do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if (i<j)swap(q[i], q[j]);
    }
    //递归
    quickSort(q, l, j);
    quickSort(q, j + 1, r);
}

归并排序

思想
和快排一样,归并排序同样运用了分治的思想。不过和快排不同,归并排序,是先递归(微分),再将有序的子序列逐渐的合二为一(积分),借此实现对数组的排序。
1.确定分界点  mid=(1+r)/2
2.递归排序 均匀分成左右两半分别递归
3. 归并一合二为一 

算法描述
1、先确定分界点,由于归并都是均匀的分为两部分,所以说分界点都是取(l+r)/2。
2、[l,mid]、[mid+1,r]根据这个规则不断的对左右子序列进行递归排序。
3、反过头进行比较合并的操作,即归并,将子序列一点点合并起来,最终便可以得到一个有序的数组。

b9e95066cdc14afa87faf1e3aa9ec8a2.gif
 

模板

void mergeSort(int q[], int l, int r) 
{
    //递归结束条件
    if (l >= r) return;
    //确定分界点
    int mid=l+r>>1;
    //递归
    mergeSort(q, 1, mid), mergeSort(q, mid + 1, r);
    //归并一合二为一(重难点)|
    int k=0, i=l, j=mid+1;
    while (i<=mid &&j<=r) 
    {
        if (q[i] <= q[j]) temp[k++]=q[i++];
        else temp[k++] = q[j++];
    }
    while (i <= mid) temp[k++]= q[i++];
    while (j<=r)temp[k++]=q[j++];
    //把结果挪回原数组
    for(i=1, j=0;i<= r; i++,j++)
    {
        q[i]= temp[j];
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值