快速排序法 為什麼i j???

2021-05-25 18:41:46 字數 1349 閱讀 7773

最近對排序的演算法比較感興趣,因為自己學習了冒泡和選擇法。就到網上找了些別的排序的方法,初步感覺直接插入法和快速排序法應該比較簡單。對於簡單插入法現在已經了解了並程式設計實現了,但是對於快速排序法的資料有個地方不是很明白,網上資料描述如下:

/*演算法過程

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用第乙個資料)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=1,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給x,即 x=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1),找到第乙個小於x的值,讓該值與x交換;

4)從i開始向後搜尋,即由前開始向後搜尋(i=i+1),找到第乙個大於x的值,讓該值與x交換;

5)重複第3、4步,直到 i=j;

例如:待排序的陣列a的值分別是:(初始關鍵資料:x=49)

a[0] 、 a[1]、 a[2]、 a[3]、 a[4]、 a[5]、 a[6]:

49 38 65 97 76 13 27

進行第一次交換後: 27 38 65 97 76 13 49

( 按照演算法的第三步從後面開始找)

進行第二次交換後: 27 38 49 97 76 13 65

( 按照演算法的第四步從前面開始找》x的值,65>49,兩者交換,此時:i=3 )

進行第三次交換後: 27 38 13 97 76 49 65

( 按照演算法的第五步將又一次執行演算法的第三步從後開始找

進行第四次交換後: 27 38 13 49 76 97 65

( 按照演算法的第四步從前面開始找大於x的值,97>49,兩者交換,此時:j=4 )

此時再執行第三步的時候就發現i=j,從而結束一躺快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。

快速排序就是遞迴呼叫此過程——在以49為中點分割這個資料序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部資料序列的快速排序,最後把此資料序列變成乙個有序的序列,根據這種思想對於上述陣列a的快速排序的全過程如圖6所示:

初始狀態

進行一次快速排序之後劃分為 49

分別對前後兩部分進行快速排序 經第三步和第四步交換後變成 完成排序。

經第三步和第四步交換後變成 完成排序。*/

這個思路也已經基本了解一些,但是對於其中的「 i=j」這個條件怎麼達到的沒搞清楚,困惑。本人比較愚鈍,就不知道怎麼j那是怎麼等於四,又怎麼i=j?    希望高手指點一下子。

為什麼快速排序比堆排序要快?

今天作演算法排序實驗,發現相同的資料規模,快速排序比堆排序的效率高很多,並且隨著資料規模的擴大,二者的差距不斷擴大,快速排序的優勢越來越明顯。快速排序的時間複雜度近似線性增長,堆排序則要大很多。究其原因,應該有以下幾個方面 在堆排序 小根堆 的時候,每次總是將最小的元素移除,然後將最後的元素放到堆頂...

快速排序法

一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,基於比較的排序,最快也只能達到o nlgn c void q...

快速排序法

include stdafx.h include vos.h define table mid machine name midmachine define table midmach colname id id define table midmach colname ip ip define t...