1. 程式人生 > >快速排序基本思路(通俗易懂+例子)

快速排序基本思路(通俗易懂+例子)

快速排序

今天看到大神寫的一篇快速排序的部落格,肅然起敬,覺得原來快速排序這麼簡單
下面進行簡單的試試

快速排序的基本思想是

1、先從數列中取出一個數作為基準數

2、分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊

3、再對左右區間重複第二步,直到各區間只有一個數

概括來說為 挖坑填數+分治法

下面舉例來進行說明,主要有三個引數,i為區間的開始地址,j為區間的結束地址,X為當前的開始的值

第一步,i=0,j=9,X=21

0 1 2 3 4 5 6 7 8 9
21 32 43 98 54 45 23 4 66 86

第二步,從j開始由,後向前找,找到比X小的第一個數a[7]=4,此時i=0,j=6,X=21
進行替換

0 1 2 3 4 5 6 7 8 9
4 32 43 98 54 45 23 21 66 86

第三步,由前往後找,找到比X大的第一個數a[1]=32,此時i=2,j=6,X=21

0 1 2 3 4 5 6 7 8 9
4 21 43 98 54 45 23 32 66 86

第四步,從j=6開始由,由後向前找,找到比X小的第一個數a[0]=4,此時i=2,j=0,X=21,發現j<=i,所以第一回結束

可以發現21前面的數字都比21小,後面的數字都比21大
接下來對兩個子區間[0,0]和[2,9]重複上面的操作即可

下面直接給出過程,就步詳細解說了

i=2,j=6,X=43

0 1 2 3 4 5 6 7 8 9
4 21 43 98 54 45 23 32 66 86

i=4,j=6,X=43

0 1 2 3 4 5 6 7 8 9
4 21 32 98 54 45 23 43 66 86

i=4,j=5,x=43

0 1 2 3 4 5 6 7 8 9
4 21 32 43 54 45 23 98 66 86

i=5,j=5,x=43

0 1 2 3 4 5 6 7 8 9
4 21 32 23 43 45 54 98 66 86

然後被分為了兩個子區間[2,3]和[5,9]

…最後排序下去就是最終的答案

0 1 2 3 4 5 6 7 8 9
4 21 23 32 43 45 54 66 86 98

總結:

1.i =L; j = R; 將基準數挖出形成第一個坑a[i]。

2.j–由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。

3.i++由前向後找比它大的數,找到後也挖出此數填到前一個坑a[j]中。

4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

分享一個比較牛逼的學習java的網站,基礎知識和架構等都有,連線如下:
http://how2j.cn?p=54321
在這裡插入圖片描述