1. 程式人生 > >C++快速排序的簡單實現

C++快速排序的簡單實現

  快速排序的基本演算法思想十分簡單,不斷地取一個數,通過交換位置,將比這個數大的數放到右邊,將比這個數小的數放到左邊。

  如果一個數左邊的數全部比它小,且右邊的數全部比它大,那麼它當前的位置,就是排序後的位置。

而快速排序就是每次取一個數,然後通過交換位置找到它的排序後位置,最終所有的數都找到了自己的位置,從而實現排序完成。

這裡寫圖片描述

圖片摘自《C++併發程式設計實戰》

快速排序的基本步驟:

  1. 取區間的第一個數,通過交換位置,使得這個數左邊的數小於自己,右邊的數大於自己。也就是說該數找到了自己排序後的位置。
  2. 第一步操作將區間分成了左右兩個區間,然後分別在左右兩個區間執行第一步的操作。

實現程式碼如下:

static int Partition(std::vector<int>& nums, int low, int high) {
  int pivote = nums[low];

  while (low < high) {
    while (low < high && nums[high] >= pivote) {
      --high;
    }
    std::swap(nums[low], nums[high]);

    while (low < high && nums[low] < pivote) {
      ++low;
    }
    std
::swap(nums[low], nums[high]); } return low; } static void QuickSort(std::vector<int>& nums, int low, int high) { if (nums.empty()) { return; } if (low >= high) { return; } int pivote_index = Partition(nums, low, high); QuickSort(nums, low, pivote_index - 1); QuickSort(nums, pivote_index + 1
, high); } void QuickSort(std::vector<int>& nums) { QuickSort(nums, 0, nums.size() - 1); } //--------------------------------------------------- void PrintNums(const std::vector<int>& nums) { for (int num : nums) { std::cout << num << " "; } std::cout << std::endl; } int main() { std::vector<int> nums{ 1, 2, 3, 4, 5, 6, 7 }; QuickSort(nums); PrintNums(nums); nums = { 9, 8, 7, 6, 5 }; QuickSort(nums); PrintNums(nums); nums = { 3, 3, 4, 1, 2 }; QuickSort(nums); PrintNums(nums); nums = { 234, 12, 235, 123, 2345, 123 }; QuickSort(nums); PrintNums(nums); return 0; }

Partition()函式的作用就是,將區間的第一個數找到它排序後的位置,這個數將這個區間分成兩部分,而這個數就是中軸。然後兩個子區間繼續執行Partition()。

int Partition(std::vector<int>& nums, int low, int high) {
  int pivote = nums[low];

  while (low < high) {
    while (low < high && nums[high] >= pivote) {
      --high;
    }
    std::swap(nums[low], nums[high]);

    while (low < high && nums[low] < pivote) {
      ++low;
    }
    std::swap(nums[low], nums[high]);
  }

  return low;
}

Partition()將第一個值作為中軸,然後將比它小的值放到它的左邊,比它的大的值放到它的右邊。要實現這一功能必須將該區間的每個值都和這個中軸值進行比較
pivote這個數會不斷的在low和high這兩個位置交換,當其在low位置時,只能用high位置的數和它比較,當其在high位置時,只能用low位置的數和它比較。

  最初pivote在位置low,然後和位置high的值進行比較,如果比它大,那麼就應該和它交換位置。交換位置之後,pivote在high位置。 然後用位置low的值和pivote進行比較,如果該值比pivote大,那麼將兩個值交換。