一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java 快速排序(QuickSort)原理及實(shí)現(xiàn)代碼

Java 快速排序(QuickSort)原理及實(shí)現(xiàn)代碼

2019-11-01 14:04java開發(fā)網(wǎng) JAVA教程

這篇文章主要介紹了Java 快速排序(QuickSort)原理及實(shí)現(xiàn)代碼,有需要的朋友可以參考一下

快速排序(QuickSort )是常用到的效率比較高的一種排序算法,在面試過程中也經(jīng)常提及。下面就詳細(xì)講解一下他的原理、給出一個(gè)Java版本的實(shí)現(xiàn)。

快速排序思想:

通過對(duì)數(shù)據(jù)元素集合Rn 進(jìn)行一趟排序劃分出獨(dú)立的兩個(gè)部分。其中一個(gè)部分的關(guān)鍵字比另一部分的關(guān)鍵字小。然后再分別對(duì)兩個(gè)部分的關(guān)鍵字進(jìn)行一趟排序,直到獨(dú)立的元素只有一個(gè),此時(shí)整個(gè)元素集合有序。

快速排序的過程——挖坑填數(shù)法(這是一個(gè)很形象的名稱),對(duì)一個(gè)元素集合R[ low ... high ] ,首先取一個(gè)數(shù)(一般是R[low] )做參照 , 以R[low]為基準(zhǔn)重新排列所有的元素。

所有比R[low]小的放前面,所有比R[low] 大的放后面,然后以R[low]為分界,對(duì)R[low ... high] 劃分為兩個(gè)子集和,再做劃分。直到low >=  high 。

比如:對(duì)R={37, 40, 38, 42, 461, 5, 7, 9, 12}進(jìn)行一趟快速排序的過程如下(注:下面描述的內(nèi)容中元素下表從 0 開始):

原始序列

37

40

38

42

461

5

7

9

12

一:high-->low

12

40

38

42

461

5

7

9

12

一:low --> high

12

40

38

42

461

5

7

9

40

二:high-->low

12

9

38

42

461

5

7

9

40

二:low --> high

12

9

38

42

461

5

7

38

40

三:high --> low

12

9

7

42

461

5

7

38

40

三:low -->high

12

9

7

42

461

5

42

38

40

四:high --> low

12

9

7

5

461

5

42

38

40

四:low --> high

12

9

7

5

461

461

42

38

40

一趟排序結(jié)果

12

9

7

5

37

461

42

38

40

 

 

開始選取基準(zhǔn) base = 37,初始位置下表 low = 0 , high = 8  , 從high=8,開始如果R[8] < base ,  將high位置中的內(nèi)容寫入到R[low]中, 將high位置空出來, low = low +1 ;

從low開始探測(cè),由于low=1 , R[low] > base ,所以將R[low]寫入到R[high] , high = high -1 ;

檢測(cè)到low < high ,所以第一趟快速排序仍需繼續(xù):

此時(shí)low=1,high=7,因?yàn)?R[high] < base ,所以將 R[high] 寫入到到R[low]中,low = low + 1;

從low開始探測(cè),low = 2 , R[low] >base ,所以講R[low]寫入到R[high],high=high-1;

繼續(xù)檢測(cè)到 low 小于high


此時(shí)low=2,high=6,同理R[high] < base ,將R[high] 寫入到R[low]中,low=low+1;

從low繼續(xù)探測(cè),low = 3 , high=6 , R[low] > base , 將R[low]寫入到R[high]中,high = high-1;

繼續(xù)探測(cè)到low小于high

此時(shí)low=3,high=5,同理R[high] < base,將R[high]寫入到R[low]中,low = low +1;

從low繼續(xù)探測(cè),low = 4,high=5,由于R[low] > base , 將R[low]寫入到R[high]中,high = high -1 ;

此時(shí)探測(cè)到low == high == 4 ;該位置即是base所在的位置,將base寫入到該位置中.

然后再對(duì)子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟快速排序,直到Rsi中只有一個(gè)元素,或沒有元素。

(注: 在以上表單中可以看到一趟排序中有一些重復(fù)的數(shù)據(jù)(原始數(shù)據(jù)中沒有重復(fù)的數(shù)據(jù)),這是因?yàn)闆]有清除該位置的數(shù)據(jù),我們?cè)谔囟ǖ臅r(shí)間看該內(nèi)存塊的數(shù)據(jù)依然是它,直到下一次將數(shù)據(jù)寫入該位置位置 —— 在此該位置的數(shù)據(jù)是一個(gè)沒有意義臟數(shù)據(jù),稱之為 “坑”)

快速排序的Java實(shí)現(xiàn):

復(fù)制代碼代碼如下:


private static boolean isEmpty(int[] n) {
        return n == null || n.length == 0;
    }

 

    // ///////////////////////////////////////////////////
    /**
     * 快速排序算法思想——挖坑填數(shù)方法:
     * 
     * @param n 待排序的數(shù)組
     */
    public static void quickSort(int[] n) {
        if (isEmpty(n))
            return;
        quickSort(n, 0, n.length - 1);
    }

    public static void quickSort(int[] n, int l, int h) {
        if (isEmpty(n))
            return;
        if (l < h) {
            int pivot = partion(n, l, h);
            quickSort(n, l, pivot - 1);
            quickSort(n, pivot + 1, h);
        }
    }

    private static int partion(int[] n, int start, int end) {
        int tmp = n[start];
        while (start < end) {
            while (n[end] >= tmp && start < end)
                end--;
            if (start < end) {
                n[start++] = n[end];
            }
            while (n[start] < tmp && start < end)
                start++;
            if (start < end) {
                n[end--] = n[start];
            }
        }
        n[start] = tmp;
        return start;
    }

 

在代碼中有這樣一個(gè)函數(shù):

復(fù)制代碼代碼如下:

 public static void quickSortSwap(int[] n, int l, int h)


該函數(shù)可以實(shí)現(xiàn),元素集合中特定的  l  到  h 位置間的數(shù)據(jù)元素進(jìn)行排序。
關(guān)于快速排序就寫到這里了。

延伸 · 閱讀

精彩推薦
  • JAVA教程Java中的final關(guān)鍵字詳細(xì)介紹

    Java中的final關(guān)鍵字詳細(xì)介紹

    這篇文章主要介紹了Java中的final關(guān)鍵字,有需要的朋友可以參考一下 ...

    java技術(shù)網(wǎng)2472019-10-29
  • JAVA教程java解析sina視頻

    java解析sina視頻

    本文介紹了一個(gè)java解析sina視頻地址的例子,從這個(gè)例子中可以學(xué)習(xí)到j(luò)ava使用sax解析xml的方法,大家可以參考修改成其它功能 ...

    java教程網(wǎng)2112019-10-30
  • JAVA教程java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼

    java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼

    現(xiàn)在項(xiàng)目里面有個(gè)需求,需要把系統(tǒng)產(chǎn)生的日志文件給下載到本地 先獲取所有的日志文件列表,顯示到界面,選擇一個(gè)日志文件,把文件名傳到后臺(tái) ...

    java代碼網(wǎng)2272019-10-15
  • JAVA教程java中final關(guān)鍵字使用示例詳解

    java中final關(guān)鍵字使用示例詳解

    Java中的final關(guān)鍵字非常重要,它可以應(yīng)用于類、方法以及變量。這篇文章中帶你看看什么是final關(guān)鍵字?將變量,方法和類聲明為final代表了什么?使用fi...

    java教程網(wǎng)3002019-10-30
  • JAVA教程java異或加密算法

    java異或加密算法

    這篇文章主要介紹了java異或加密算法,有需要的朋友可以參考一下 ...

    java教程網(wǎng)2012019-10-25
  • JAVA教程對(duì)Java中JSON解析器的一些見解

    對(duì)Java中JSON解析器的一些見解

    這篇文章主要是對(duì)Java中JSON解析器的一些見解。需要的朋友可以過來參考下,希望對(duì)大家有所幫助 ...

    java教程網(wǎng)3222019-10-23
  • JAVA教程詳解java并發(fā)之重入鎖-ReentrantLock

    詳解java并發(fā)之重入鎖-ReentrantLock

    這篇文章主要介紹了java并發(fā)之重入鎖-ReentrantLock,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面...

    胖虎。。1822019-06-24
  • JAVA教程java線程并發(fā)countdownlatch類使用示例

    java線程并發(fā)countdownlatch類使用示例

    javar的CountDownLatch是個(gè)計(jì)數(shù)器,它有一個(gè)初始數(shù),等待這個(gè)計(jì)數(shù)器的線程必須等到計(jì)數(shù)器倒數(shù)到零時(shí)才可繼續(xù)。 ...

    java技術(shù)網(wǎng)1752019-10-31
主站蜘蛛池模板: 黑人与欧洲女子性大战 | 精品国语对白精品自拍视 | 女人被男人躁得好爽免费视频 | 午夜精品国产自在现线拍 | 69日本xxxhd| 久久久久青草大香线综合精品 | 欧美日韩一区二区三区韩大 | 丝袜足液精子免费视频 | 卫生间被教官做好爽HH视频 | 亚洲日本在线观看网址 | 白丝爆动漫羞羞动漫网站 | 嫩草影院地址一地址二 | 亚洲123区 | 久久久免费热线精品频 | 青青国产成人久久91网 | 亚洲 欧美 清纯 校园 另类 | 国产成人精品免费久久久久 | 91手机在线 | 无限资源在线观看完整版免费下载 | 国产亚洲女在线线精品 | 久久久无码精品亚洲A片软件 | 爆操女友| 爽好舒服快想要免费看 | 久青草国产观看在线视频 | 天天色影视综合网 | 王晶三级作品 | 国产男人搡女人免费视频 | 动漫在线观看h | 万域之王动漫在线观看全集免费播放 | 欧美日韩久久中文字幕 | aⅴ导航站 | 日本在线视频播放 | 午夜精品在线 | 日韩免费一级片 | 欧美日韩色图 | 亚洲乱亚洲乱妇41p国产成人 | 免费国产在线观看 | 精品无码一区二区三区中文字幕 | 大陆男男gayxxxxvideo | 久久精品国产免费播放 | 男人j放进女人的p视频免费 |