1. 程式人生 > >3.1.1蠻力法之選擇排序

3.1.1蠻力法之選擇排序

特性 序表 sel div wap 數組 排列 code for

選擇排序開始的時候,我們掃描整個列表,找到它的最小元素,然後和第一個元素交換,將最小元素放到它在有序表中的最終位置上。然後我們從第二個元素開始掃描列表,找到最後n-1個元素中的最小元素,再和第二個元素交換位置,把第二小的元素放在它的最終位置上。一般來說,在對該列表做第i遍掃描的時候(i的值從0到n-2),該算法在最後n-i個元素中尋找最小元素,然後拿它和Ai交換。在n-1遍以後,該列表就被排好序了。

算法偽代碼(假設列表由數組實現)

SelectionSort(A[0...n-1])

//輸入:一個可排序數組A[0...n-1]

//輸出:升序排列的數組A[0...n-1]

for i←0
to n-2 do min←i for j←i+1 to n-1 do if A[j]<A[min] min←j swap A[i] and A[min]

執行次數 技術分享

對於任何輸入來說,選擇排序都是一個Θ(n2)的算法。然而,請註意,鍵的交換次數僅為Θ(n),或者更精確一點,是n-1次(i循環每重復一次執行一次交換)。這個特性使得選擇排序優於其他的排序算法。

C++代碼

#include<iostream>
using namespace std;

void SelectionSort(int a[], int
n) { for (int i = 0; i < n-1; i++) { int min = i; for (int j = i + 1; j < n; j++) { if (a[j] < a[min]) min = j; } swap(a[i], a[min]); } } int main() { int a[] = {89, 45, 68, 90, 29, 34, 17}; SelectionSort(a, sizeof(a) / sizeof
(a[0])); for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { cout << a[i] << " "; } cout << endl; return 0; }

3.1.1蠻力法之選擇排序