1. 程式人生 > >劍指offer之快速排序

劍指offer之快速排序

快速排序

歡迎關注作者部落格
簡書傳送門

  今天介紹快速排序,這也是在實際中最常用的一種排序演算法,速度快,效率高。就像名字一樣,快速排序是最優秀的一種排序演算法。
思想
  快速排序採用的思想是分治思想。
  快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正 確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。
  舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為:
  2

2 4 9 3 6 7 1 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); } } }