1.原理
Quick Sort 屬于交換排序,是對(duì)冒泡算法進(jìn)行的改造。
基本原理:分治法和填坑法
- 分治法:
- 首先將問題轉(zhuǎn)化為子問題,取數(shù)組的第一個(gè)元素key,然后將數(shù)組里的所有元素小于key的放在左邊,大于key的放在右邊。
- 此時(shí)再次重復(fù)這個(gè)過程,去小于key的元素,取第一個(gè)元素key2,然后將數(shù)組的所有元素小于key2的放在左邊,大于key2的放在右邊。
- 再次重復(fù).......直到全部排序好。
- 填坑法
- 用于數(shù)組排序,取第一個(gè)元素key,然后將a[0]空出來,然后i=0,j=n。
- 設(shè)置大循環(huán),保證i<j。
- 設(shè)置子循環(huán),從后往前找,如果大于key就執(zhí)行j--。
- 設(shè)置判定語句,如果小于key,將a[j]的值填入a[i]。
- 設(shè)置子循環(huán),從前往后找,如果小于key就執(zhí)行j++。
- 設(shè)置判定語句,如果大于key,就將a[i]的值填入a[j]。
- 大循環(huán)結(jié)束,將key值填入a[i]。
-
填坑法第一步,設(shè)值,key,i,j
-
從后往前第一次小循環(huán)
-
從前往后第一次小循環(huán)
-
從后往前第二次小循環(huán)
-
結(jié)束大循環(huán),將key值填入a[i]。
2.java寫法
- 分為兩部分:分治遞歸quicksort和partition方法。
實(shí)現(xiàn)填坑法partition():
private static int partition(int a[], int i, int j) {
int key = a[i];//key值
while (i < j) {
while (i < j && a[j] > key)// 從右向左小循環(huán)
j--;
if (a[j] <= key)//判定填充
a[i] = a[j];
while (i < j && a[i] < key)// 從左向右小循環(huán)
i++;
if (a[i] >= key)//判定填充
a[j] = a[i];
}
a[i] = key;// 把軸元素放在軸所在地位置
return i;// 返回軸所在的位置
}
實(shí)現(xiàn)遞歸的quicksort():
private void quickSort(int data[], int low, int high) {// 遞歸
int q;
if (low < high) {
q = partition(data, low, high);
quickSort(data, q + 1, high);//對(duì)q左邊進(jìn)行分類
quickSort(data, low, q - 1);//對(duì)q右邊進(jìn)行分類
}
}
3.時(shí)間復(fù)雜度
對(duì)于劃分成子問題求解的問題,公式為:
T(n) = a*T(n/b)+f(n)最好的情況,每次劃分都是按照折半劃分,快排的a=b=2,f(n)為partition()的規(guī)模。公式為:
T(n) = 2*T(n/2)+f(n)
例如 3,2,4。
復(fù)雜度為T(n) = O(nlogn)最壞的情況,每次劃分都是:
T(n) = T(n-1)+T(1)+f(n)
例如 2,3,4。
復(fù)雜度為T(n) = O(n^2)