這涵蓋了來自https://stackoverflow.com/help/on-topic的「軟件算法」,或者在這種情況下,用於對一組數字進行排序的快速排序算法。如何理解或解釋在Quicksort中第一次調用分區?
這是我現在用的是快速排序算法代碼(開裂編碼採訪第五版)
static void quickSort(int[] arr, int left, int right) {
int index = partition(arr, left, right);
if(left < index - 1) {
//sort left half
quickSort(arr, left, index - 1);
}
if(index < right) {
//sort right half
quickSort(arr, index, right);
}
}
static int partition(int[] arr, int left, int right) {
int pivot = arr[ (left + right)/2];
while(left <= right) {
while(arr[left] < pivot) {
left ++;
}
while(arr[right] > pivot) {
right --;
}
if(left <= right) {
swap(arr, left, right);
left ++;
right --;
}
}
return left;
}
static void swap(int arr[], int one, int two) {
int temp = arr[one];
arr[one] = arr[two];
arr[two] = temp;
}
我知道快速排序算法的總結是讓所有小於樞軸的元素出現在左邊的樞軸和大於樞軸的所有元件都在樞軸的右側。順便說一下,是否存在與樞軸相同的元素應該去哪裏的規則?
所以我的試運行是從https://www.hackerrank.com/challenges/angry-children
{10, 100, 300, 200, 1000, 20, 30}
這個排序的數組後第一個電話進行分區,這是我選擇了基於該算法的我的數組
[10, 100, 30, 20, 1000, 200, 300]
樞軸的狀態是200的值。然而在第一次通話之後,我不知道如何理解這一點,因爲200左邊的所有東西都不小於200(1000)。我知道這個算法是有效的,因爲我得到了最終結果排序數組。
有人可以幫我解釋第一次調用分區的結果嗎?
所有的元素小於200是所有元素不小於200 – immibis 2015-02-08 00:40:32
但我認爲前它是「從元素<左側分支元素和右側元素>右側分支元素」https://courses.cs.washington.edu/courses/cse373/13wi/lectures/02-27/20-sorting3-merge- quick.pdf slide 16 – committedandroider 2015-02-08 00:43:01
@lared但它應該仍然遵循規則嗎?一切都小於左側的旋轉軸,一切都大於右側的旋轉軸 – committedandroider 2015-02-08 00:46:07