交换排序之高速排序[通俗易懂]

交换排序之高速排序

大家好,又见面了,我是全栈君。

今天大鹏哥跟大家一起学习下交换排序中的高速排序。

高速排序是对冒泡排序的一种改进。它的基本思想是。通过一趟排序将待排记录切割成独立的两部分,当中一部分记录的keyword均比还有一部分的keyword小。则可分别对这两部分记录继续进行排序,以达到真个序列有序。

高速排序基本步骤:

         Step1、定义两个变量low和high,他们的初值分别为low和high,此外另一个变量pivotkey。

         Step2、首先从high所指位置向前搜索找到第一个keyword小于pivotkey的记录和pivotkey交换。

         Step3、从low所指位置向后搜索。找到第一个keyword大鱼pivotkey的记录和pivotkey交换。

         Step4、反复以上步骤直到low=high为止。

 

待排序列:49   38   65   97   76   13   27  49

1、附设low和high以及设枢轴记录的keyword为pivotkey:

                    49   38   65   97  76   13   27   49

                     ↑(low)                               ↑(high)

                    ↑(pivotkey)

2、从high所指位置向前搜索,找到第一个小于pivotkey的记录(此处为27)和枢轴记录互相交换:

                    27   38   65   97  76   13   49   49

                     ↑(low)                               ↑(high)

                                                            ↑(pivotkey)

3、从low所指位置向后搜索,找到第一个大于pivotkey的记录(此处为65)和枢轴记录互相交换:

                   27   38   49  97   76   13   65   49

                              ↑(low)              ↑(high)

                              ↑(pivotkey)

4、反复2、3步直至low=high为止。

                 27   38   13   97  76   49   65   49

                           ↑(low)         ↑(high)

                                            ↑(pivotkey)

                27   38   13   49  76   97   65   49

                                ↑(low) ↑(high)

                                ↑(pivotkey)

                 27   38   13   49  76   97   65   49

                                ↑(low=high)

                                ↑(pivotkey)

上面给出的是一趟快排过程,整个快排过程可递归进行,上述操作完毕后,再分别对两个子序列进行高速排序。

Java实现例如以下:

        

public class QuickSort {

 

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub

       int[] a={49,38,65,97,76,13,27,49};

       int pivotloc,low=0,high=a.length-1;

       System.out.print(排序前:”);

       for(int x:a){

           System.out.print(x+“,”);

       }

       if(low<high){

           pivotloc = quickSort(a,low,high);

           quickSort(a,low,pivotloc-1);

           quickSort(a,pivotloc+1,high);

       }

       System.out.print(排序后:”);

       for(int x:a){

           System.out.print(x+“,”);

       }

    }

 

    private static int quickSort(int[] a, int low, int high) {

       int pivotkey=a[low];

       while(low<high){

           while(low<high&&a[high]>=pivotkey)

              high–;

           a[low]=a[high];

           while(low<high&&a[low]<=pivotkey)

              low++;

           a[high]=a[low];

       }

       a[low]=pivotkey;

       return low;

    }

 

}

高速排序的时间复杂度为O(NlogN)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116541.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vfs_fsync[通俗易懂]

    vfs_fsync[通俗易懂]在Linux系统中,对文件系统上文件的读写一般是通过页缓存(pagecache)进行的(DirectIO除外),这样设计的可以延时磁盘IO的操作,从而可以减少磁盘读写的次数,提升IO性能。但是性能和可靠性在一定程度上往往是矛盾的,虽然内核中设计有一个工作队列执行赃页回写同磁盘文件进行同步,但是在一些极端的情况下还是免不了掉电数据丢失。因此内核提供了sync、fsync、fdatasync和msync系统调用用于同步,其中sync会同步整个系统下的所有文件系统以及块设备,而fsync和fdatasync只针

    2022年5月7日
    74
  • 【JavaScript】——入门

    【JavaScript】——入门

    2021年9月7日
    52
  • 表白代码Python_自制表白神器

    表白代码Python_自制表白神器文章目录前言演示网站制作部署网站二维码制作总结前言跟着我做,不要跳着看,否则你会失败。第一步是制作二维码;第二步是制作网站。演示具体成果地址:https://yanghanwen.xyz/ai/网站制作首先你需要下载我的这个完整项目:链接:https://pan.baidu.com/s/1EmRehx_gRnT5hLjJvKuAIg提取码:pz1y–来自百度网盘超级会员V2的分享下载好后文件目录如下:然后你需要注意的是我把img里面的图片删了,涉及隐私,大家自己替换自己追

    2022年8月23日
    6
  • 易语言跳出循环 c,易语言教程循环控制(到循环尾和跳出循环)[通俗易懂]

    易语言跳出循环 c,易语言教程循环控制(到循环尾和跳出循环)[通俗易懂]到循环尾()和跳出循环()是易语言对循环的两种控制方式,教程分别了举例师范讲解。一、官方源码到循环尾调用格式:〈无返回值〉到循环尾()-系统核心支持库->流程控制英文名称:continue本命令转移当前程序执行位置到当前所处循环体的循环尾语句处。本命令为初级命令。操作系统需求:Windows、Linux、Unix跳出循环调用格式:〈无返回值〉跳出循环()-系统核心支持库…

    2022年7月13日
    12
  • Window.location.search和Window.location.hash区别[通俗易懂]

    Window.location.search和Window.location.hash区别[通俗易懂]search:只能取到“?”后面和“#”之前的内容,如果“#”之前没有“?”search取值为空hash:第一个”#”之后的内容

    2022年7月16日
    13
  • oracle与mysql的存储区别_存储过程和触发器的区别和联系

    oracle与mysql的存储区别_存储过程和触发器的区别和联系1.创建存储过程语句不同oraclecreateorreplaceprocedureP_ADD_FAC(id_fac_cdINES_FAC_UNIT.FAC_CD%TYPE)asmysqlDROPPROCEDUREIFEXISTS`SD_USER_P_ADD_USR`;createprocedureP_ADD_FAC(id_fac_…

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号