-
總所周知 快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用。
-
基本原理是 陣列a = [1,3,5,7,6,4,2]
1 選定一個 基準 a[0] 2 把比 a[0]小的放左邊,比a[0]大的放右邊. 中斷遞迴如果少於兩個數字 則不執行。 3 然後再分別對兩邊 執行 1,2,3操作。 -
對快速排序 的 想法 1 在待排序元素 大部分是有序的情況下, 速度 非常很快。 2 在最差的情況下,速度就很慢了。 相當於冒泡了 3 所以 快排的 優化, 定基準 非常重要,例如待排序是有序的,基準定在中間,xiao'lv 4 時間複雜度為nlogn,不穩定排序
-
Swift 極簡版本 import UIKit extension Array { var decompose : (head: Element, tail: [Element])? { return (count > 0) ? (self[0], Array(self[1..<count])) : nil } }
func qsortDemo(input: [Int]) -> [Int] { if let (pivot, rest) = input.decompose { let lesser = rest.filter { $0 < pivot }//這裡是小於於pivot基數的分成一個陣列 let greater = rest.filter { $0 >= pivot }//這裡是大於等於pivot基數的分成一個陣列 return qsortDemo(lesser) + [pivot] + qsortDemo(greater)//遞迴 拼接陣列 } else { return [] } } var a:[Int] = [1,2,4,6,2,4,3,7,8] qsortDemo(a) 複製程式碼
///次方法來自http://blog.csdn.net/cg1991130/article/details/48274919
-
swift 版本 import UIKit
func quickSort(inout a:[Int],l:Int,r:Int){ if l < r { var i = l, j = r ,x = a[i] while i < j && a[j] >= x{ j -= 1 } if i < j { a[i] = a[j] i += 1 } while i < j && a[i] < x { i += 1 } if i < j { a[j] = a[i] j -= 1 } a[i] = x quickSort(&a, l: l, r: i-1) quickSort(&a, l: i+1, r: r) } } var b = [8,7,6,5,4,3,2,1] quickSort(&b, l: 0, r: 7) print(b) 複製程式碼
-
c版本
#include <stdio.h>
///三個引數 a要排序的 陣列, l掃左邊的 r掃右邊
void quickSort(int a[],int l, int r){
/// 左邊要小於 右邊才有意義
if (l < r){
//儲存 一下 ,基準定為X
int i = l, j = r, x = a[i];
///左邊小於右邊才開始迴圈,排序裡面
while (i < j) {
///從 右邊開始向左查詢,小於 基準X的值。
while (i < j && a[j] >= x)
j--;
if (i < j)
a[i++] = a[j];///調換 他們的值
///該從左邊開始向右查詢 比基準x大與等於值
while (i < j && a[i] < x)
i++;
if (i < j)
a[j--] = a[i];
}
///然後把 x的值 賦值回去
a[i] = x;
///遞迴 左邊
quickSort(a, l, i-1);
///右邊
quickSort(a, i+1, r);
}
}
int main() {
int a[8] = {8,7,6,5,4,3,2,1};
quickSort(a, 0, 7);
for (int i = 0; i < 8; i++) {
printf("%d",a[i]);
}
printf("\n");
return 0;
}
複製程式碼
- ######看我那麼可愛n(≧▽≦)n
- 關注我的微薄 (樑同桌):http://weibo.com/tongrenyinsheng
- 個人部落格: http://www.liangtongzhuo.com
- ios 個人寫的app (同人音聲)ASMR音樂