排序之快速排序

dreamcasher發表於2018-08-08

快速排序的精髓在於如何理解它的演算法,我稱之為“填坑法”。假入有一陣列arr,陣列第一個元素的索引為head,最後一個元素的索引為last,把第一個元素“挖”出來,臨時儲存,記錄“坑”的位置,這便是“挖坑”。坑有了,如何“填坑”呢?大致思路是,從最後一個元素開始,逐一遞減,直到找到一個元素比臨時值小,那麼將該資料放入“坑”中,並記錄“坑”的位置;然後從第一個元素開始,逐一遞增,直到找到一個元素比臨時值大,那麼將該資料放入“坑”中,並記錄“坑”的位置;然後又從last的位置開始往前找比臨時值小的元素……像這樣迴圈往復,直到head比last大,最後一定剩下了一個“坑”,並且處於中間位置。這樣的結果便是某一元素處於中間位置,它前面的元素都比它小,它後面的遠都比它大。核心演算法闡述完畢。之後再對該元素前面的元素和後面的元素分別做上述操作即可(遞迴)。下面給一個用java實現的整型陣列快排的例子:

import java.util.Arrays;

public class QuickSort {
  public static void sort(int[] arr, int head, int last) {
    int mid = quickSort(arr, head, last);
    if (mid > head) {
      // 遞迴
      sort(arr, head, mid - 1);
    }
    if (mid < last) {
      // 遞迴
      sort(arr, mid + 1, last);
    }
  }

  private static int quickSort(int[] arr, int head, int last) {
    int index = head; //index:記錄坑的位置
    int temp = arr[head]; //temp:臨時值
    while (head < last) {
      while (last > head) {
        if (arr[last] < temp) {
          arr[index] = arr[last];   //填坑
          index = last;
          break;
        }
        last--;
      }
      while (head < last) {
        if (arr[head] > temp){
          arr[index] = arr[head];   //填坑
          index = head;
          break;
        }
        head++;
      }
    }
    arr[index] = temp;  // 最後把臨時值放入坑中
    return index;   //返回中間值的位置
  }

  public static void main(String[] args) {
    int[] arr = new int[]{5,3,2,1,4,2,1,8,9};
    sort(arr, 0, arr.length-1);
    System.out.println(Arrays.toString(arr));
  }
}

 

相關文章