演算法思路:
從待排元素中選取任意乙個元素,把它當做分割槽點(基準值),在遍歷的時候比基準值小的放在他的左邊,比基準值大的放在右邊。在一次遍歷結束後,基準元素在最終位置
穩定行:不穩定演算法,
擴充套件問題:如何在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...
快速排序及其優化
快速排序是比較經典 常用的演算法,下面簡要介紹其思路。對於乙個陣列,選取某個元素作為切分元素 比如第乙個元素 然後把比這個元素小的都放到它前面,比這個元素大的都放到它後面,這樣切分元素的最終位置就確定了,並且陣列被劃分為兩個子陣列。然後再用同樣的方法分別對子陣列進行排序,最終整個陣列將變成有序的。這...