程式人生寫程式,又拿程式換酒錢。
阿新 • • 發佈:2019-01-25
快排(quick sort),是快速排序的簡稱。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
快排有很多版本,不同的版本其寫法略有差別,此處給出一種雙指標掃描法。
具體做法是:(此處是升序,降序同理)
1.需要排序的區間是
[l,r] ,當l<r 時,選取下標pos=l 的數,設為val,否則退出
2.在[l,r] 區間中,將小於val的數放在左邊,將大於等於val的數放在右邊,將val這個值放在中間,讓pos等於此位置
3.遞迴將[ 排序,遞迴將l,pos−1][pos+1,r] 排序
/*
Author: Royecode
Date: 2015-07-22
*/
//將陣列升序排序
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
//將l到r排好序
void quick_sort(int l, int r, int *arr)
{
if(l < r)
{
int begin = l, end = r, val = arr[l];
while(begin < end)
{
while(begin < end && arr[end] >= val) --end; //將大於等於val的數放在右邊
if(begin < end) arr[begin] = arr[end];
while(begin < end && arr[begin] < val) ++begin; //將小於val的數放在左邊
if(begin < end)arr[end] = arr[begin];
}
arr[begin] = val;
//begin位置的數已確定,將[l, begin - 1]排序,將[begin + 1, r]排序
quick_sort(l, begin - 1, arr);
quick_sort(begin + 1, r, arr);
}
}
int main()
{
srand(time(NULL));
const int size = 8;
int arr[size];
for(int i = 0; i < size; ++i) //隨機生成範圍[0,size)的size個數
arr[i] = rand() % size;
for(int i = 0; i < size; ++i) //排序前
cout << arr[i] << "\n"[i != size - 1];
quick_sort(0, size - 1, arr);
for(int i = 0; i < size; ++i) //排序後
cout << arr[i] << "\n"[i != size - 1];
return 0;
}
一般來說,快排的時間複雜度是
void disorderly(int *arr, int n)
{
srand(time(NULL));
for(int i = 0; i < n; ++i)
{
int x = rand() % n, y = rand() % n;//隨機生成[0, n)的兩個下標
swap(arr[x], arr[y]);
}
}
所以快排的時間複雜度是