一看就懂的快速排序

2022-03-18 08:06:57 字數 3350 閱讀 7061

快速排序屬於交換排序,主要步驟是使用基準元素進行比較,把小於基準元素的移動到一邊,大於基準元素的移動到另一邊。從而把陣列分成兩部分,然後再從這兩部分中選取出基準元素,重複上面的步驟。過程如下:

紫色:基準元素

綠色:大於基準元素

黃色:小於基準元素

這種思路叫做分治法。

基準元素的選取可隨機選取。下面使用中我會使用第一位的元素作為基準元素。

排序拆分過程如下圖:

紫色為基準元素,(每一輪都重新選取)

綠色為其他元素

第一輪

第二輪

第三輪

如上圖所示:

若元素個數為n,因為排序過程中需要和全部元素都比較一遍,所以時間複雜度為o(n),

而平均情況下排序輪次需要logn輪,因此快速排序的平均時間複雜度為o(nlogn)。

實現方法有雙邊迴圈法和單邊迴圈法

首選選取基準元素(pivot)4,並設定指標left和right,指向陣列最左和最右兩個元素,如下:

第一次迴圈,先從right指標指向的資料(rightdata)開始和基準元素比較

若 rightdata >= pivot,則right指標向左移動,若 rightdata < pivot,則right指標不移動,切換到left指標

left指標指向資料(leftdata)與基準元素比較,若 leftdata <= pivot,則left指標向右移動,若 leftdata > pivot,交換left和right指向的元素。

第一輪指標移動完後,得到如下結構:

然後 left和right指向的元素進行交換:

第一輪迴圈結束,重新切換到right指標,重複上述步驟。

第二輪迴圈後,得:

第三輪迴圈後,得:

第四輪迴圈後,得:

判斷到left和right指標指向同乙個元素,指標停止移動,使pivot和指標元素進行交換,得:

宣告該輪迴圈結束,並根據pivot元素切分為兩部分,這兩部分的陣列再根據上述步驟進行操作。

public class doublesort 

// 基準元素位置

int pivotindex = partition(arr, startindex, endindex);

// 根據基準元素,分成兩部分進行遞迴排序

quicksort(arr, startindex, pivotindex - 1);

quicksort(arr, pivotindex + 1, endindex);

}public static int partition(int arr, int startindex, int endindex)

// 控制left指標比較並右移

while (left < right && arr[left] <= pivot)

// 交換left和right指標所指向的元素

if (left < right)

}arr[startindex] = arr[left];

arr[left] = pivot;

return left;

}public static void main(string args) ;

quicksort(arr, 0, arr.length - 1);

system.out.println(arrays.tostring(arr));}}

雙邊迴圈法從陣列的兩邊比較並交換元素,而單邊迴圈法則從陣列的一邊遍歷,一直往後比較和交換,實現起來更加的簡單。

過程如下:

首先也是選取基準元素pivot(可以隨機選擇)

設定乙個mark指標指向陣列的起始位置,代表小於基準元素的區域邊界(不理解的就把它理解成是等會用來交換元素的就好了)

原始陣列如下:

從基準元素下一位開始遍歷陣列

如果該元素大於基準元素,繼續往下遍歷

如果該元素小於基準元素,mark指標往右移,因為小於基準元素的區域邊界增大了1(即小於基準元素的多了1位),所以mark就 +1,並且該元素和mark指向元素進行交換。

遍歷到元素3時,因為3 < 4,所以mark右移

然後交換元素

然後就繼續遍歷,根據上面的步驟進行判斷,後面的過程就不寫了。

public class singlesort 

// 基準元素位置

int pivotindex = partition(arr, startindex, endindex);

// 根據基準元素,分成兩部分進行遞迴排序

quicksort(arr, startindex, pivotindex - 1);

quicksort(arr, pivotindex + 1, endindex);

}/**

* 分治(單邊迴圈法)

* @param arr

* @param startindex

* @param endindex

* @return

*/public static int partition(int arr, int startindex, int endindex)

mark ++;

int temp = arr[mark];

arr[mark] = arr[i];

arr[i] = temp;

}arr[startindex] = arr[mark];

arr[mark] = pivot;

return mark;

}public static void main(string args) ;

quicksort(arr, 0, arr.length - 1);

system.out.println(arrays.tostring(arr));}}

一看就懂的氣泡排序

不用走啦,看得懂的啦!相鄰兩個數比較大小,較大的下沉 較小的上浮。從第乙個數開始,比較第乙個數和第二個數大小,如果第乙個數比第二個數大,則交換兩個數的位置,使大的數排在後面,依次比較第二個數和第三個數,使第三個數比第二和第乙個數大,直到倒數兩個數,將最大的數移動到最後一位。演算法分為兩個迴圈 1.外...

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂TCP 連線

我們先來看乙個定義。這樣理解比較抽象。我們換個角度。它的本質還是傳輸控制。如果讓我們自己設計這個傳輸,我們會怎麼想呢。tcp 協議它會先建立連線。三次握手目的是保證雙方都有傳送和接收的能力 首要原因是為了防止舊的重複連線初始化造成混亂。同步雙方初始序列號客戶端和服務端都處於 closed 狀態。先是...