冒泡优化,选择优化和快速排序问题概述

快速排序,冒泡优化,选择排序优化问题

对于一般的的排序问题,主要有快速排序,冒泡排序,选择排序问题,而在此介绍冒泡排序的优化和选择排序的优化问题。以下为一些常见排序算法的时间,空间复杂度
排序算法复杂度

选择排序优化

选择排序优化的主要思想是比而不换,普通的选择排序优化核心部分是两个数据相比较,如果满足比较的条件则交换两者的位置,这样一来会增加交换的次数。例如
4,2,3,1,5进行升序排序的时候。首先4和2比较,大的往后换,则4向后换,4和3比较任然向后,和1比较还是向后,一共交换了3次。结果为2,3,1,4,5.如果只记录下标,则只需要将1和4交换一次即可,结果为1,2,3,4,5.
以下为选择排序代码的优化(比而不换)

void selectSort(int *p,int n)
{
    int q;//记录下标位置
    for(int i =0;i<n-1;i++)
    {
        q =i;
        for(int j=i+1;j<n;j++)
        {
            if(p[q]>p[j])//比而不换
            {
                q=j;
            }

        }
        if(q!=i)//交换
        {
            p[i]^=p[q];
            p[q]^=p[i];
            p[i]^=p[q];
        }

    }
}

冒泡优化(序则不排)

冒泡排序如果有两两之间没有任何一次交换,我们亦可以认为该数组已经有序。例如
1,2,3,4,5.两两之间没有任何的交换,我们则认为该数组已经有序。
所以只需要有一个flag去记录内层循环是否交换了,如果交换则继续进行,如果没有则跳出循环。下面是代码实例

void PopSort(int*p,int n)
{

    for(int i =0;i<n-1;i++)
    {
       int flag=0;//记录是否有交换
        for(int j=0;j<n-1-i;j++)
        {
            if(p[j]>p[j+1])
            {
                p[j]^=p[j+1];
                p[j+1]^=p[j];
                p[j]^=p[j+1];
               flag=1;//如果交换则将标志置1


            }

        }
        if(flag==0)//判断是否有交换
        {

            break;
        }
    }

}

快速排序 左(小而移动,大而填坑),右(大而移动,小而填坑)

在这里插入图片描述两个高低标志位,先取出地位的数据,从高位开始比较,如果大则向前移动,如果小则填充地位,然后换成低位比较,如果低位小则向前移动,大则向高位填充,然后再换成高位,低位,高位,低位依次循环,直到low=high。然后完成第一次的排序,这样一来被排数据的左侧都比其小,右侧都比其大,然后递归上述过程。当low=high即可结束。
以下为代码部分`

void fastSort(int*p,int low,int high)
{
    if(low<high)
    {
        int q =p[low];//获得低位的标志位
        int l=low;int h= high;
        while(l<h)   //完成内部循环交换
        {
            while (p[h]>=q&&l<h)//大则前移
                h--;
            p[l]=p[h];          //小而填坑
            while(p[l]<=q&&l<h)//小则前移
                l++;            
            p[h]=p[l];         //大则填坑

        }
        p[h]=q;
        fastSort(p,low,l-1);//左递归
        fastSort(p,l+1,high);//右递归
    }
}

小结

1.冒泡和选择排序优化问题比较简单,记住 :比而不换,序则不排
2.快速排序记住: 左(小而移动,大而填坑),右(大而移动,小而填坑) 深刻理解其含义,并且画图多理解理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值