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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - JAVA教程 - Java 快速排序(QuickSort)原理及實現代碼

Java 快速排序(QuickSort)原理及實現代碼

2019-11-01 14:04java開發網 JAVA教程

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

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

快速排序思想:

通過對數據元素集合Rn 進行一趟排序劃分出獨立的兩個部分。其中一個部分的關鍵字比另一部分的關鍵字小。然后再分別對兩個部分的關鍵字進行一趟排序,直到獨立的元素只有一個,此時整個元素集合有序。

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

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

比如:對R={37, 40, 38, 42, 461, 5, 7, 9, 12}進行一趟快速排序的過程如下(注:下面描述的內容中元素下表從 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

一趟排序結果

12

9

7

5

37

461

42

38

40

 

 

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

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

檢測到low < high ,所以第一趟快速排序仍需繼續:

此時low=1,high=7,因為 R[high] < base ,所以將 R[high] 寫入到到R[low]中,low = low + 1;

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

繼續檢測到 low 小于high


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

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

繼續探測到low小于high

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

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

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

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

(注: 在以上表單中可以看到一趟排序中有一些重復的數據(原始數據中沒有重復的數據),這是因為沒有清除該位置的數據,我們在特定的時間看該內存塊的數據依然是它,直到下一次將數據寫入該位置位置 —— 在此該位置的數據是一個沒有意義臟數據,稱之為 “坑”)

快速排序的Java實現:

復制代碼代碼如下:


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

 

    // ///////////////////////////////////////////////////
    /**
     * 快速排序算法思想——挖坑填數方法:
     * 
     * @param n 待排序的數組
     */
    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;
    }

 

在代碼中有這樣一個函數:

復制代碼代碼如下:

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


該函數可以實現,元素集合中特定的  l  到  h 位置間的數據元素進行排序。
關于快速排序就寫到這里了。

延伸 · 閱讀

精彩推薦
  • JAVA教程Java中的final關鍵字詳細介紹

    Java中的final關鍵字詳細介紹

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

    java技術網2472019-10-29
  • JAVA教程java解析sina視頻

    java解析sina視頻

    本文介紹了一個java解析sina視頻地址的例子,從這個例子中可以學習到java使用sax解析xml的方法,大家可以參考修改成其它功能 ...

    java教程網2112019-10-30
  • JAVA教程java web項目實現文件下載實例代碼

    java web項目實現文件下載實例代碼

    現在項目里面有個需求,需要把系統產生的日志文件給下載到本地 先獲取所有的日志文件列表,顯示到界面,選擇一個日志文件,把文件名傳到后臺 ...

    java代碼網2272019-10-15
  • JAVA教程java中final關鍵字使用示例詳解

    java中final關鍵字使用示例詳解

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

    java教程網3002019-10-30
  • JAVA教程java異或加密算法

    java異或加密算法

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

    java教程網2012019-10-25
  • JAVA教程對Java中JSON解析器的一些見解

    對Java中JSON解析器的一些見解

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

    java教程網3222019-10-23
  • JAVA教程詳解java并發之重入鎖-ReentrantLock

    詳解java并發之重入鎖-ReentrantLock

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

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

    java線程并發countdownlatch類使用示例

    javar的CountDownLatch是個計數器,它有一個初始數,等待這個計數器的線程必須等到計數器倒數到零時才可繼續。 ...

    java技術網1752019-10-31
主站蜘蛛池模板: 九九久久国产精品大片 | 欧美女孩13一14v | 九九精品视频在线观看 | 亚洲国产日韩欧美在线vip1区 | 国产性视频 | 我的家教老师 | 91肥熟国产老肥熟在线 | 91香蕉国产 | 日本人成大片在线 | 男人猛进女人屁股免费 | 第一福利在线视频 | 香蕉tv亚洲专区在线观看 | 男生同性啪视频在线观看 | 成人在线观看一区 | 538免费精品视频搬运工 | 青丝视频免费版在线看 | 免费看美女被靠到爽的视频 | 97色综合 | 超强台风免费观看完整版视频 | 国产馆在线观看免费的 | 亚洲欧美综合区自拍另类 | 东北老女人91p0rny | 久久久无码精品亚洲欧美 | 欧美日韩亚洲综合在线一区二区 | 亚洲a图| 成人久久18免费网站入口 | 成人欧美一区二区三区黑人 | 亚洲精品www久久久久久久软件 | 激情另类国内一区二区视频 | 操比视频| 幻女free性摘花第一次 | chinesespanking网站| 国产男女乱淫真视频全程播放 | 四虎影库紧急大通知 | 黑人与欧洲女子性大战 | 久久精品熟女亚洲AV国产 | 欧美bbxx| 精品夜夜澡人妻无码AV蜜桃 | 饭冈加奈子在线播放观看 | 四虎精品免费视频 | haodiaocao几万部精彩视频 |