【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

这篇具有很好参考价值的文章主要介绍了【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

0.常见的排序算法:

1.冒泡排序:

1.1冒泡排序代码实现:

1.2冒泡排序代码优化:

2.快速排序:

​编辑2.1Hore法:

2.2挖坑法:

 2.2.1挖坑法代码实现:

2.3双指针法:

2.3.1双指针法代码实现:        

2.4选取Key的方式:

2.4.1选择第一个:

2.4.2选择中间:

2.4.3三数取中:

完结撒花:


【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

 

0.常见的排序算法:

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

常见的排序算法有这些.将会分成几个章节讲完,感兴趣的uu们可以关注下我的排序专栏,方便和后期观看.

这章重点讲交换排序中的:冒泡排序与快速排序.其中冒泡排序比较简单,而快速排序就有点困难了.话不多说我们开始

1.冒泡排序:

冒泡排序十分的简单,也是大多数朋友刚学习编程时就学会的排序方法.顾名思义:要排序的数就像一个气泡一样,一直往上冒,直到到达水面(也就是目标位置),每冒一次,下一次的气泡需要走的路程就-1,也就是水面下降.

其时间复杂度为O(N^2)

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

1.1冒泡排序代码实现:

void BubbleSort(int *a,int len)
{
    for(int i=0;i<len;i++)
        for(int j=1;j<len-i;j++)
        {
            if(a[j]>a[j-1])
            {
                swap(a[j],a[j-1]);
            }
        }
}

冒泡排序就写好啦,但这里可以优化一下:当剩下的数组有序的时候,还需要冒完全程嘛?

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

所以当有一次遍历发现一次都没有交换的时候,此时就可以推出冒泡.因为数组已经有序 

1.2冒泡排序代码优化:

void BubbleSort(int *a,int len)
{
    for(int i=0;i<len;i++)
     {      
        int exchage=1;
        for(int j=1;j<len-i;j++)
        {
            if(a[j]>a[j-1])
            {
                swap(a[j],a[j-1]);
                exchage=0;
            }
            
        }
        if(exchage)break;
     }
}

2.快速排序:

一听这个名字有没有觉得很高大,快速排序.

                                        我们通过一个动图来了解一下他是怎样工作【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

由浅入深,我们先来了解一下他单趟排序的过程.

首先先确定一个Key,这个时候一般是取第一个数字为key.

之后设定两个哨兵位,分别为左边第一个位置与右边第一个位置.

因为取定key的位置为.左边第一个.

所以要从右边先开始走.当右边遇到比key小的数字的时候就停下来.

这时候左边开始走,当遇到比key大的数字的时候.就停下来.

交换此时左边与右边所代表的数字

右边重新开始.重复这个过程.

直到两边相遇.将key和其交换即可.

(为什么相遇了交换则完成单趟排序以及解释下为什么要从key的对面开始走)

相遇了就说明,左边的都是比key小的.右边的都比key要大,则所以把key与当前这个位置交换就可以了

进而就可以解释为什么,要先从key的对面走.

因为要找比key小的,这样相遇的时候右边停留的才是比key小的(因为右边遇到小的先停下来)

之后再将其分为左半边与右半边进行上面的过程即可.

2.1Hore法:

刚刚介绍的这种方法就是Hore排序的方法,后面大部分的方法都是基于其基础上进行改进,所以我们先来看看他的代码实现

void PartSort1(int* a, int left, int right)//hore
{

    if(left>=right)return ;
    int key =left;
    int i=left,j=right;
    while(i<j)
    {
        while(i<j&&a[j]>=a[key])j--;
        while(i<j&&a[i]<=a[key])i++;
        if(i<j)swap(a[i],a[j]);
    }

    swap(a[key],a[i]);
    PartSort1(a,left,i-1);
    PartSort1(a,j+1,right);

}

注意,当中哨兵位寻找停下位置的时候,一定要加上等于的判断 ,否则当有一个数据等于key的值时,哨兵就会在这卡住.

2.2挖坑法:

其内容大致也与Hore法相似,不过是换了一种形式来进行排序.

先将Key作为坑挖出

之后右哨兵指向的位置(比key小的值)填入坑位中,转换坑位.

之后左哨兵指向的位置(比key大的值)填入坑位中,继续交互坑位

最后相遇的位置即为Key存入的位置

总的来说与Hore法大同小异.

不过与Hore法不同的是,必须先将Key的值保存下来(因为过程中产生了交换),否则最后填入的是交换后的值

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

 

 2.2.1挖坑法代码实现:

void PartSort3(int* a, int left, int right)//挖坑
{
    if(left>=right)return ;
    key=left;
    int begin=left,end=right;

    int value=a[begin];

    int hole=begin;

    while(begin<end)
    {
        while(begin<end&&a[end]>=value)end--;
        a[hole]=a[end];
        hole=end;
        while(begin<end&&a[begin]<=value)begin++;
        a[hole]=a[begin];
        hole=begin;
    }
    a[hole]=value;
    PartSort3(a,left,hole-1);
    PartSort3(a,hole+1,right);
}

2.3双指针法:

这个方法就与上面的有本质的区别了.先来看看动图理解下

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

其本质就是利用一段区间来维护比key大的数字.(用这个思想我们来理解下)

首先依旧先确定Key的值,因为prev与cur这段区间内维护的是比其大的值.

当cur指向的元素比key大的时候,直接后移cur,表示收入这段区间内

当cur指向元素比key小的时候,前移prev,此时指向的元素是区间内比key大的,与刚刚cur的元素进行一个交换.再前移cur.此时区间内仍然保持着都比key大的性质

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

2.3.1双指针法代码实现:        

void PartSort4(int* a, int left, int right)//双指针
{
    if(left>=right)return ;
    key=left;
    int prev=left,cur=left+1;
    while(cur<=right)
    {
        if(a[cur]<a[key]&&++prev!=cur)
        {
            swap(a[cur],a[prev]);
        }
        ++cur;
    }
    swap(a[prev],a[key]);
    PartSort4(a, left,prev-1);
    PartSort4(a, prev+1,right);
}

2.4选取Key的方式:

介绍几种常用选择Key的方式.

2.4.1选择第一个:

当key选择第一个的时候,有可能会出现这个数就是这里面最小/最大的,若出现这种情况,则会让排序效率下降.

2.4.2选择中间:

同样会出现上述的情况.

2.4.3三数取中:

将left,right,medium(left+right/2)对应的三个数进行比较.之后将中间值放到Left位上即可.

int getMedium(int *a,int left,int right)
{
    int medium=(left+right)>>1;
    if(a[left]>a[right])
    {
        if(a[medium]>a[right]&&a[medium]<a[left])
            return medium;
        else if(a[medium]<a[right])
            return right;
        else 
            return left;
    }
    //right>left 
    else {
        if(a[medium]>a[left]&&a[medium]<a[right])
            return medium;
        else if(a[medium]<a[left])
            return left;
        else
            return right;
    }
}
//调用getmedium的格式
int key =getMedium(a,left,right);
    if(a[key]!=a[left])swap(a[key],a[left]);

完结撒花:

🌈本篇博客的内容【排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!        文章来源地址https://www.toymoban.com/news/detail-431530.html

到了这里,关于【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【排序算法(三)】交换排序(冒泡排序&&快速排序)

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【排序算法(二)】选择排序(直接选择排序堆排序) 冒泡排序属于交换排序,所谓 交换排序 就是就是根据序列中两个记录

    2023年04月22日
    浏览(44)
  • 排序算法1:冒泡排序、快速排序、插入排序

    排序算法:交换类排序,插入类排序、选择类排序、归并类排序 交换类排序:冒泡排序、快速排序 一、冒泡排序  时间复杂度:内层是ji,外层是从0到n-1,运行的总次数是1+2+3+4+...+n-1,即O() 空间复杂度:O(1),没有使用额外空间,不会因为n的变化而变化 如果数组本身有序,最

    2024年02月21日
    浏览(46)
  • 冒泡排序 简单选择排序 插入排序 快速排序

    bubblesort 两个for循环,从最右端开始一个一个逐渐有序 selectsort 假设是升序,两个for循环,从最左端开始一个一个逐渐有序,找到lengh-1个无序区的最小值 insertsort 两个for循环,从最左端开始一个一个逐渐有序,默认第一个就是有序区,第一个for遍历无序区,第二个for循环遍历

    2024年02月13日
    浏览(46)
  • 【数据结构】排序(2)—冒泡排序 & 快速排序

                                      目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性            冒泡排序是一种交换排序。两两比较数组元素,如果是逆序(即排列顺序

    2024年02月08日
    浏览(80)
  • 【六大排序详解】终篇 :冒泡排序 与 快速排序

    冒泡排序如同泡泡上升一样,逐个逐个向上冒,一个接一个的冒上去。两两比较,较大者(较小者)向后挪动。全部遍历一遍即可完成排序。 首先从头开始,两两相互比较。每次排好一个最大(最小) 然后在从头开始,两两比较 至已排序部分之前。 依次往复,全部遍历一遍

    2024年02月03日
    浏览(34)
  • 排序算法乱炖: 快速排序、归并排序、冒泡排序

    1. 快速排序原地版 最好情况的时间复杂度 :O(nlogn),logn为递归的层数,n为每层递归中总的时间复杂度。 最差情况的时间复杂度 :O(n*n) 2. 快速排序空间换时间版 最好情况的时间复杂度 :低于O(nlogn) 思想 :分治。分而治之 ,递归的把数据一分为二,直到数组中只有一个元素

    2024年02月11日
    浏览(48)
  • DS八大排序之冒泡排序和快速排序

    前两期我们已经对\\\"插入排序\\\"(直接插入排序和希尔排序) 和 \\\"选择排序\\\"(直接选择排序和堆排序)进行了详细的介绍~!这一期我们再来详细介绍一组排序 :\\\"交换排序\\\"即耳熟能详的冒泡排序和赫赫有名的快速排序~! 冒泡排序 快速排序(Hoare、挖坑、前后指针、非递归)

    2024年02月02日
    浏览(36)
  • 十大排序算法之冒泡排序、快速排序的介绍

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 说起来冒泡排序,是我们接触到的最早的一个排序算法了,这次就当进行一个巩固提升了。冒泡排序还被称为 交换排序 。 冒泡排序: 它重

    2024年02月07日
    浏览(43)
  • 快速了解四种排序算法:希尔排序,堆排序,快速排序,冒泡排序(c语言)

     一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。 1.1算法(algorithm ) 是指令的集合,是为解决特定问题而规定的一系列操作。 它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据

    2024年02月16日
    浏览(51)
  • DS:八大排序之堆排序、冒泡排序、快速排序

                                                     创作不易,友友们给个三连吧!!  堆排序已经在博主关于堆的实现过程中详细的讲过了,大家可以直接去看,很详细,这边不介绍了 DS:二叉树的顺序结构及堆的实现-CSDN博客 直接上代码: 建堆的时间复杂度是o(N),

    2024年02月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包