排序 快速排序及其優化(Java)

2021-09-22 12:34:08 字數 1344 閱讀 8645

演算法思路:

從待排元素中選取任意乙個元素,把它當做分割槽點(基準值),在遍歷的時候比基準值小的放在他的左邊,比基準值大的放在右邊。在一次遍歷結束後,基準元素在最終位置

穩定行:不穩定演算法,

擴充套件問題:如何在o(n)的適建範圍內找到乙個無需陣列的k大元素

方法一:遞迴方法

優化1..當排序的集合幾乎接近有序時,由於預設選擇的第乙個元素作為基準值,會導致基準值劃分的兩個子樹組嚴重不均衡,此時分層下來的結果近乎n層,此時快拍退化為複雜度為o(n^2)的排序演算法

問題:可能一邊陣列特別多某一邊陣列特別少,兩邊的長度不均衡。

解決思路:隨機選取乙個元素作為基準值,來降低每次都選到最小或最大數的概率。

public static void quicksortinternal(int arr,int left,int right)

//隨機選取乙個元素作為基準值,來降低每次都選到最小或最大值的概率

public static int partion1(int arr,int left,int right)

private static void swap(int arr, int a, int b)

//優化二:解決大量重複元素導致基準值兩邊的陣列長度不均衡問題

public static int partion2(int arr,int left,int right)

swap(arr,i,j);

i++;

j--;

}swap(arr,left,j);

return j;

}

3.三路快排:針對於有大量重複元素的陣列進行排序

對裡面的大於小於,和等於都做了區分。它之排序裡面值比較大於或者小於基準值的元素,

//這裡只用遞迴大於和小於基準值的數,等於的不用管

quicksortinternal2(arr,left,lt-1);

quicksortinternal2(arr,gt,right);

}

排序 快速排序及其優化

在排序中交換數字,達到排序的目的 由於 是c語言寫的,所以需要給出交換函式 如果是c 那麼就直接用交換函式 void swap int left,int right 先標記基準值 這裡先取最後乙個元素為基準值,記錄起來 之後定義兩個指標,然後前後遍歷,找到比基準值大的或者小的的元素的位置,然後進行標...

快速排序及其優化

include include 呼叫c 自帶sort include include include using namespace std define max 1000000 define k 12 ifdef debug define new new normal block,file lin...

快速排序及其優化

快速排序是比較經典 常用的演算法,下面簡要介紹其思路。對於乙個陣列,選取某個元素作為切分元素 比如第乙個元素 然後把比這個元素小的都放到它前面,比這個元素大的都放到它後面,這樣切分元素的最終位置就確定了,並且陣列被劃分為兩個子陣列。然後再用同樣的方法分別對子陣列進行排序,最終整個陣列將變成有序的。這...