快排的詭異之處

2021-08-24 19:22:43 字數 1679 閱讀 5236

如果in-place做quick sort,選擇放置pivot的位置會影響到**細節。

同樣的實現方式,選擇第乙個元素為pivot時,恢復pivot位置就得以hi為準。

public class testquicksort ;

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

for (int i : arr) system.out.println(i);

}public static void quicksort(int arr, int left, int right)

while (arr[--hi] > pivot)

if (lo >= hi) break;

swap(arr, lo, hi);

}swap(arr, left, hi);

quicksort(arr, left, hi - 1);

quicksort(arr, hi + 1, right);

}public static void swap(int arr, int i, int j)

}

反之,以最後乙個元素為pivot時,恢復pivot就得以lo為準。

public class testquicksort ;

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

for (int i : arr) system.out.println(i);

}public static void quicksort(int arr, int left, int right)

while (arr[--hi] > pivot)

if (lo >= hi) break;

swap(arr, lo, hi);

}swap(arr, right, lo);

quicksort(arr, left, lo - 1);

quicksort(arr, lo + 1, right);

}public static void swap(int arr, int i, int j)

}

這是因為這種實現方式中,在選取恢復pivot的下標時,應選取「安全」的那個,也就是永遠不會超過pivot所在位置的那個。

如果選取中間的元素為pivot,則無需恢復pivot,而且無論以lo還是hi為基準繼續快排都行,因為在滿足迴圈的結束條件時它們肯定相等。

public class testquicksort ;

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

for (int i : arr) system.out.println(i);

}public static void quicksort(int arr, int left, int right)

while (arr[--hi] > pivot)

if (lo >= hi) break;

swap(arr, i, j);

}quicksort(arr, left, lo - 1);

quicksort(arr, lo + 1, right);

}public static void swap(int arr, int i, int j)

}

clang 的詭異之處

最近一次作業,寫乙個高精度 運算 當然寫的時候有點小錯誤,程式執行一直失敗,在除錯的時候居然發現一件詭異的事情 我個人認為是clang 有問題,但通常說clang 編譯更嚴格,也可能是我寫法的問題 望各位指正 amrzs ubuntu bigint g g main.cpp bigint.cpp o...

快排2 經典快排和荷蘭國旗快排

基礎知識見 建議先閱讀基礎知識,並自己手推一遍 演算法原理 第一步 取陣列最後乙個數作為num,將陣列中的 num的數放在陣列的左邊,num的數放在陣列的右邊,這是可以理解為分成了兩個陣列 第二步 然後將 num的部分當成乙個陣列,繼續第一步 num的部分同理 第三步 若陣列的大小 2,則結束。流程...

python實現快排演算法 python快排演算法詳解

快排是python經典演算法之一。1 下面講解的是什麼是快排和快排的圖示。2 快排是一種解決排序問題的運算方法。3 快排的原理 在陣列中任意選擇乙個數字作為基準,用陣列的資料和基準資料進行比較,比基準數字打的數字的基準數字的右邊,比基準數字小的數字在基準數字的左邊,第一次排序之後分為比基準資料大或比...