快速排序通過乙個切分元素將陣列分為兩個子陣列,左子陣列小於等於切分元素,右子陣列大於等於切分元素,將這兩個子陣列排序也就將整個陣列排序了。
切分過程:通常取陣列第乙個元素作為切分,然後從陣列的左端向右掃瞄直到找到第乙個大於等於它的元素,再從陣列的右端向左掃瞄找到第乙個小於它的元素,交換這兩個元素。不斷進行這個過程,就可以保證左指標 i 的左側元素都不大於切分元素,右指標 j 的右側元素都不小於切分元素。當兩個指標相遇時,將切分元素 a[l] 和 a[j] 交換位置
效能分析:
快速排序是原地排序,不需要輔助陣列,但是遞迴要用輔助棧,最好的情況下是將陣列切分成二個一樣的部分。複雜度為o(n*logn)
最壞情況下是原來陣列就已經有序,這時複雜度就為o(n^2),因此為防止陣列一開始就有序,應該隨機打亂陣列的順序。
關於優缺點和相關的優化,這篇文章寫的挺好的:快速排序
和這篇:
解決原陣列有序的情況:找乙個可能在檔案的中間位置的元素作為pivot。則可以選取陣列中最左邊元素、最右邊元素以及中間元素中中間大小的元素作為pivot,這樣使得最壞情況幾乎不可能再發生
public class revicedemo
if(array[center]>array[right])
//比較center和left,讓最大的在left位置上
if(array[center]>array[left])
return array[left]; //array[left]的值已經被換成三數中的中位數, 將其返回
}private static int partitionit(int array, int left, int right)
while (true)
while (j > 0 && array[--j] > pivot)
if (i >= j) else
}swap(array, left, j);//基準元素和游標相遇時所指元素交換,為最後一次交換
return j;// 一趟排序完成, 返回基準元素位置(注意這裡基準元素已經交換位置了)
}public static void swap(int arr,int i,int j)
public static void main(string args) ;
int i = medianof3(arr, 0, arr.length - 1);
system.out.print(i);}}
解決陣列長度較小的時候,用插入排序解決陣列中重複元素較多的時候,可用荷蘭國旗問題解決:實際上荷蘭國旗問題可以解決陣列中有大量重複元素,和陣列原來有序的情況,關鍵**在於swap(arr, l + (int) (math.random() * (r - l + 1)), r);
public class quicksort
quicksort(arr, 0, arr.length - 1);
} public static void quicksort(int arr, int l, int r)
} public static int partition(int arr, int l, int r) else if (arr[cur] > arr[r]) else
} swap(arr, more, r);
return new int ;
} public static void swap(int arr, int i, int j)
快速排序及其改進
public class quciksort private static int partition comparable a,int low,int high a low pivot return low private static boolean less comparable v,comp...
快速排序改進原理及其實現
快速排序是現在計算機中排序演算法相對比較快的一種演算法,在各類語言中的排序演算法大都是快速排序演算法 現在我們來講解一下快速排序的原理及其實現 快速排序最主要的思想就是,找到乙個基準點,然後把大於這個基準點的數放在後面,小於基準點的數放在前面然後根據這個基準點的位置進行遞迴分別處理前面後後面的陣列完...
快速排序改進
快速排序平均複雜度為o nlgn 最壞情況為o n 2 即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o nlogn 最壞情況下為o n 2 1.如果在排序時選取最後乙個元素為基準,則可以通過以下方法來避免劃分的不平衡。int ...