第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

【新手自白書】簡(jiǎn)單快速排序的實(shí)現(xiàn)(JAVA)

標(biāo)簽:
Java

复习一下快速排序

  • 快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(来自百度百科)
    冒泡排序传送门
      快速排序的思路大概可以这样理解:
      有两个人,L和R分别站在数据data的两端,这两个人规定了一个值K,只要R头顶的值不小于K,R就走一步,直到走到一个值比K小,L恰恰相反,L头顶的值如果不大于K,L就走一步,直到走到一个值比K大。当两个人都停下的时候,就交换头顶的值,如果两个人相遇在一个地方,就把相遇的那个值和K交换,然后两个人停止前行。

图片描述
这样操作后,LR相遇点之前的值一定小于K,LR相遇点之后的值一定大于K,可以自行手动验证(#滑稽)。
之后我们可以以相遇点为分界,得到两个子表,这两个子表分别以这种方式进行操作,就可以把无序列变为有序列。本质上是递归。
需要注意的是,我们进行操作的时候必须按照先R后L的顺序才可以正确的递归,而K值一般取data[0]。

在方法设计上,要注意如何递归,我们给LR相遇点的下标取名mid,表总长length,左子表的下标值在0~mid-1,右子表的下标值在mid+1~length-1。所以我们每次递归都要返回mid值,才能正确的递归。

public int getMid(int[] list,int left,int right){
        right = right - 1 ;
        int key = list[left] ;
        while(left < right){
            while(left < right && list[right] > key){
                right -- ;
            }
            while(left < right && list[left] < key){
                left ++ ;
            }
            //mid = left ;
            int temp = list[left] ;
            list[left] = list[right] ;
            list[right] = temp ;
        }
        int temp = list[left] ;
        list[left] = key ;
        key = temp ;
        return left ;
    }

每次获取mid的方法完成。
递归方法很简单,只需要在一个方法里调用获取mid的方法即可。

public void sort(int[] list,int left,int right){
        int mid = 0 ;
        if(left < right){
            mid = this.getMid(list,left,right) ;
            this.sort(list, 0, mid-1) ;
            this.sort(list, mid+1, right) ;
        }
    }

总体类设计如下:

public class QSort{

    private int[] data = null ;
    //private int[] array = null ;

    public QSort(int[] data,int left,int right){
        this.setData(data) ;
        this.sort(data, left, right) ;
    }

    private void setData(int[] data){
        this.data = data ;
    }

    public String getArray(){
        String s = "排序后:" ;
        for(int i : this.data){
            s = s + i + " " ; 
        }
        return s ;
    }

    public void sort(int[] list,int left,int right){
        int mid = 0 ;
        if(left < right){
            mid = this.getMid(list,left,right) ;
            this.sort(list, 0, mid-1) ;
            this.sort(list, mid+1, right) ;
        }

    }
    public int getMid(int[] list,int left,int right){
        right = right - 1 ;
        int key = list[left] ;
        while(left < right){
            while(left < right && list[right] > key){
                right -- ;
            }
            while(left < right && list[left] < key){
                left ++ ;
            }
            //mid = left ;
            int temp = list[left] ;
            list[left] = list[right] ;
            list[right] = temp ;
        }
        int temp = list[left] ;
        list[left] = key ;
        key = temp ;
        return left ;
    }
} 
  • 测试
public class Test {

    public static void main(String[] args) {

        System.out.println(new QSort(new int[]{7,1,4,2,9,3,8,5,10,6},0,10)
                            .getArray());

    }

}
  • 结果

排序后:1 2 3 4 5 6 7 8 9 10

點(diǎn)擊查看更多內(nèi)容
13人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消