排序演算法 之 快速排序

2022-03-27 17:32:45 字數 1305 閱讀 7721

快速排序是基於分治思想的一種排序演算法,就像該方法的名字一樣,速度比較快,所以叫做快速排序;它的平均時間複雜度為o(n*logn),最壞時間複雜度為o(n²)。快速排序也有很多優化的版本,比如在排序時基數的選擇等等…下面就說一下一般的快速排序的實現。

基本思想:

快速排序的基本思想就是,先從待排序的序列中任選乙個元素作為基數,然後將序列中的其他小於基數的元素放在基數的左邊,大於或等於基數的元素放在基數的右邊,第一次的時候雖然序列中的左半部分中的元素都小於基數,序列中右半部分中的元素都大於或等於基數,但這兩部分內部元素並不一定是有序的,不要緊,只要我們把左右兩半部分序列分別繼續執行第一步,這樣不斷的把序列分解然後排序,直到分到最後所分解的序列中元素的數量都為1,則排序完成序列有序。

下面看圖:這是乙個待排序的序列52

6178

493第一步,選擇基數,一般選擇序列的首個元素為基數,這裡選擇首個元素5為基數,並記錄在臨時變數中,記錄此時序列的起始位置下標i=0,結束位置下標j=8;

第二步,從位置j開始向左找,每移動乙個位置j--,當找出乙個小於基數的元素時把該元素放入剛才選擇基數的位置即(i=0),同時使i++;如下圖:32

6178

493第三步,從位置i開始向右找,每移動乙個位置i++,當找出乙個大於或等於基數的元素時把該元素放入位置j,同時j--;如下圖:32

6178

496第四步,重複執行第

二、第三步直至i==j時結束,然後把基數放入位置i;最後如下圖:32

4158

796第五步,將基數左右兩邊的序列重複執行第

一、二、三、四、五步直至最後分解的所有序列中元素數量都為1則排序結束序列有序。

有了上面的分析過程下面看**實現:

///

///快速排序

//////

//////

public

static

void quicksort(int intarray, int left, int

right)

if (i //從左向右找大於或等於x的數來填intarray[j]

while (i < j && intarray[i] if (i }

//退出迴圈時 i==j

intarray[i] =x;

quicksort(intarray, left, i - 1

); quicksort(intarray, i + 1

, right);

}}

當呼叫時left傳入序列開始的下標即0,right傳入序列結束的下標即(長度-1);

以上就是快速排序的實現。

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...

排序演算法之快速排序

快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...

排序演算法之快速排序

快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...