劍指offer之快速排序
阿新 • • 發佈:2018-11-06
快速排序
歡迎關注作者部落格
簡書傳送門
今天介紹快速排序,這也是在實際中最常用的一種排序演算法,速度快,效率高。就像名字一樣,快速排序是最優秀的一種排序演算法。
思想
快速排序採用的思想是分治思想。
快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。
舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為:
2
5
首先用2當作基準,使用i j兩個指標分別從兩邊進行掃描,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移
2 2 4 9 3 6 7
1
5 比較2和1,1小於2,所以把1放在2的位置2 1
4
9 3 6 7 1 5 比較2和4,4大於2,因此將4移動到後面2 1 4 9 3 6
7
4 5 比較2和7,2和6,2和3,2和9,全部大於2,滿足條件,因此不變經過第一輪的快速排序,元素變為下面的樣子
[1] 2 [4 9 3 6 7 5]
之後,在把2左邊的元素進行快排,由於只有一個元素,因此快排結束。右邊進行快排,遞迴進行,最終生成最後的結果。
/**
* @program:
* @description: 快速排序
* @author: zhouzhixiang
* @create: 2018-11-01 20:20
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{1,8,9,4,3,2,5,7,10};
quicksort(arr,0,arr.length-1);
for(int i = 0; i < arr.length; i++){
System. out.print(arr[i]+" ");
}
}
private static void quicksort(int[] arr, int left, int right) {
if(arr == null || arr.length == 0) return;
if(left < right){
int key = arr[left];
int low = left;
int hi = right;
while (low < hi){
while (low < hi && arr[low] < key)
low++;
arr[hi] = arr[low];
while (low < hi && arr[hi] > key)
hi--;
arr[low] = arr[hi];
}
arr[low] = key;
quicksort(arr, left, low - 1);
quicksort(arr, low + 1, right);
}
}
}