JAVA 實現(xiàn)快速排序

高效的分治排序

????快速排序是冒泡排序的改進版,是目前已知的最快的排序方法。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 該排序算法的基本思想是:

1.先從數(shù)列中取出一個數(shù)作為基準(zhǔn)數(shù)。

2.分區(qū)過程,將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。

3.再對左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個數(shù)。

  優(yōu)點:極快,數(shù)據(jù)移動少;

? ? ? ? 缺點:不穩(wěn)定。

算法實現(xiàn)

假設(shè)我們現(xiàn)在要對{5,7,2,1,9,10,4,6,3,8}這個數(shù)組進行快速排序,我們應(yīng)該怎么怎么做呢?

1.立Flag

? ? Flag就是我們之前提到的基準(zhǔn)數(shù),為了將數(shù)據(jù)分區(qū),立Flag是第一步也是最關(guān)鍵的一步。在這里我們將數(shù)組的第一個數(shù)設(shè)為基準(zhǔn)數(shù)。

2.探測

? ? 對于{5,7,6,1,9,10,4,2,3,8}這個數(shù)組,第一次排序我們的Flag是5,我們分別從數(shù)組的左右兩端開始“探測”。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

我們定義i指向數(shù)組的最左端,定義j指向數(shù)組的最右端。首先將j向左移,直到j(luò)指向的數(shù)小于5;再將i向右移,直到i指向的數(shù)大于5。最終i指向7,j指向3。


3.交換

? ? 將3和7交換,數(shù)組變?yōu)閧5,3,2,1,9,10,4,6,7,8}。第一次交換結(jié)束。


接下來繼續(xù)探測、交換,探測、交換......

4.Flag落位

第二次交換結(jié)束后數(shù)組變?yōu)閧5,3,2,1,4,10,9,6,7,8}。


j指向9的位置,i指向4的位置,j繼續(xù)向左移動,直到i的位置才找到小于5的值。

此時i=j,我們只需將Flag落在這個位置:將5和4的值交換。數(shù)組變?yōu)閧4,3,2,1,5,10,9,6,7,8}。


至此,5這個Flag完成了它的歷史使命,第一輪交換結(jié)束。

數(shù)組被劃分為兩個區(qū),F(xiàn)lag左邊是小于Flag的{4,3,2,1},F(xiàn)lag右邊是大于Flag的{10,9,6,7,8}。


5.遞歸

我們再分別對這兩個區(qū)進行第二輪交換,交換結(jié)果是{1,3,2,4}和{8,9,6,7,10}

對于{1,3,2}和{8,9,6,7}重復(fù)進行以上操作,直至得到不能拆解的單個數(shù)字,排序完成!

下面用圖展示整個排序過程:


6.JAVA代碼

public class QuickSort {

? ? public static void quickSort(int[] arr,int low,int high){

? ? ? ? int i,j,temp,t;

? ? ? ? if(low>high){

? ? ? ? ? ? return;????

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i=low;

? ? ? ? j=high;

? ? ? ? //temp就是基準(zhǔn)位

? ? ? ? temp = arr[low];

? ??????while (i<j){

? ??????//先看右邊,依次往左遞減

? ?????????????????? while (temp<=arr[j]&&i<j){? ?????????

? ????????????? ? ? j--;

? ? ? ? }

? ??????//再看左邊,依次往右遞增

????????????????????while (temp>=arr[i]&&i<j){

? ? ????????????? ? i++;

? ? ? ? }

????????? ?????? //如果滿足條件則交換

? ? ? ? ? ? ? ? if (i<j){? ? ? ? ? ?????????

? ? ? ????????????? ?t=arr[j];

????????????????????arr[j]=arr[i];

? ????????????? ? ? arr[i]=t;

? ? ? ????????? }

????????}

//最后將基準(zhǔn)為與i和j相等位置的數(shù)字交換

????????arr[low] = arr[i];

? ? ? ? arr[i] = temp;

? ??????//遞歸調(diào)用左半數(shù)組

????????quickSort(arr, low, j-1);? ?

? ?????? //遞歸調(diào)用右半數(shù)組

????????quickSort(arr, j+1, high);

}

public static void main(String[] args){

????????int[] arr = {6,1,2,7,9,11,4,5,10,8};

????????quickSort(arr, 0, arr.length-1);

????????for (int i = 0; i < arr.length; i++) {

????????????????System.out.println(arr[i]);

????????}

????}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最常見的七大排序算法,整理了下,包括時間復(fù)雜度和空間復(fù)雜度都做一個詳細的解說,希望對需要的人能有所幫助。 /** ...
    PapiAP閱讀 381評論 0 2
  • 7種常用的排序算法總結(jié) 2016.04.30PoetryAlgorithm 排序算法:一種能將一串?dāng)?shù)據(jù)依照特定的排...
    raining_804f閱讀 862評論 0 0
  • 寫作是一個具有系統(tǒng)性的技能,是由寫作方法和基本規(guī)律構(gòu)成的。學(xué)習(xí)寫作,可以全方位提高自己的能力。 注意:寫作不是一件...
    小原ing閱讀 257評論 2 2
  • 又一次來到這里。 沿著長長的小青磚鋪就的小巷,一直往前,一座雕花樓左拐,穿過一個深深的庭院 ,抬頭,殘垣斷壁間依然...
    春羽之閱讀 290評論 0 2
  • 人世的風(fēng)沙雕塑我的模樣 四面八方的繩索把我捆綁 世界是一個大大的囚房 仿佛,沒有人可以逃過命運的流放 沒有人可以躲...
    心海安瀾閱讀 343評論 4 8

友情鏈接更多精彩內(nèi)容