C++快速排序的簡單實現
阿新 • • 發佈:2019-02-05
快速排序的基本演算法思想十分簡單,不斷地取一個數,通過交換位置,將比這個數大的數放到右邊,將比這個數小的數放到左邊。
如果一個數左邊的數全部比它小,且右邊的數全部比它大,那麼它當前的位置,就是排序後的位置。
而快速排序就是每次取一個數,然後通過交換位置找到它的排序後位置,最終所有的數都找到了自己的位置,從而實現排序完成。
快速排序的基本步驟:
- 取區間的第一個數,通過交換位置,使得這個數左邊的數小於自己,右邊的數大於自己。也就是說該數找到了自己排序後的位置。
- 第一步操作將區間分成了左右兩個區間,然後分別在左右兩個區間執行第一步的操作。
實現程式碼如下:
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大,那麼將兩個值交換。