1. 程式人生 > >程式人生寫程式,又拿程式換酒錢。

程式人生寫程式,又拿程式換酒錢。

快排(quick sort),是快速排序的簡稱。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
快排有很多版本,不同的版本其寫法略有差別,此處給出一種雙指標掃描法。
具體做法是:(此處是升序,降序同理)

1.需要排序的區間是[l,r],當l<r時,選取下標pos=l的數,設為val,否則退出
2.在[l,r]區間中,將小於val的數放在左邊,將大於等於val的數放在右邊,將val這個值放在中間,讓pos等於此位置
3.遞迴將[

l,pos1]排序,遞迴將[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; }

一般來說,快排的時間複雜度是O(nlogn),但有時最壞的情況會退化到O(n2),可以採取一定措施避免這一點,那就是在開始排序的時候,寫一個函式將需要排序的陣列打亂順序。做法如下:

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]);
    }
}

所以快排的時間複雜度是O(nlogn),空間複雜度O(1)