Ο(n log n)
次比較,在最壞狀況下則需要Ο(n2)
次比較,但這種狀況並不常見。Ο(n log n)
演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。<stdlib.h>
標準庫提供,函數的宣告如下:
void qsort(
void* base, size_t num, size_t size,
int (*cmp)(const void*, const void*)
);
#include <stdio.h> #include <stdlib.h> #define DIM(x) (sizeof(x)/sizeof((x)[0])) static int cmp(const void* a, const void* b) { const int* pa = (int*)a; const int* pb = (int*)b; return *pa - *pb; } int main() { int values[] = { 42, 8, 109, 97, 23, 25 }; int i; qsort(values, DIM(values), sizeof(values[0]), cmp); for(i = 0; i < DIM(values); i++) { printf ("%d ",values[i]); } return 0; }程式碼說明如下:
a[i]=a[j]
,若在排序之前,a[i] 在 a[j] 前面,並且在排序之後,a[i] 仍然在 a[j] 前面,則這個排序演算法才算是穩定的。O(N²)
,平均的時間複雜度是O(N*lgN)
。O(N)
,需要遍歷多少次呢?至少lg(N+1)
次,最多 N 次。lg(N+1)
。因此,快速排序的遍歷次數最少是lg(N+1)
次。package main import ( "fmt" ) func main() { Arr := []int{23, 65, 13, 27, 42, 15, 38, 21, 4, 10} qsort(Arr, 0, len(Arr)-1) fmt.Println(Arr) } /** 快速排序:分治法+遞迴實現 隨意取一個值A,將比A大的放在A的右邊,比A小的放在A的左邊;然後在左邊的值AA中再取一個值B,將AA中比B小的值放在B的左邊,將比B大的值放在B的右邊。以此類推 */ func qsort(arr []int, first, last int) { flag := first left := first right := last if first >= last { return } // 將大於arr[flag]的都放在右邊,小於的,都放在左邊 for first < last { // 如果flag從左邊開始,那麼是必須先從有右邊開始比較,也就是先在右邊找比flag小的 for first < last { if arr[last] >= arr[flag] { last-- continue } // 交換資料 arr[last], arr[flag] = arr[flag], arr[last] flag = last break } for first < last { if arr[first] <= arr[flag] { first++ continue } arr[first], arr[flag] = arr[flag], arr[first] flag = first break } } qsort(arr, left, flag-1) qsort(arr, flag+1, right) }執行結果如下:
[4 10 13 15 21 23 27 38 42 65]