1. 程式人生 > >演算法設計與分析之選擇排序

演算法設計與分析之選擇排序

基本思想

選擇排序開始的時候,掃描整個序列,找到整個序列的最小記錄和序列中的第一個記錄交換,從而將最小記錄放到它在有序區的最終位置上,然後再從第二個記錄開始掃描序列,找到n-1個序列中的最小記錄,再和第二個記錄交換記錄。
一般地,第i趟排序從第i個記錄開始掃描序列,在ni+1(1in1)記錄中找到關鍵碼最小的記錄,並和第i個記錄交換作為有序序列的第i個記錄。如下圖所示:

選擇排序演算法C語言描述

void SelectSort(int r[],int n)
{
    int i,j,index;
    for(i=0;i<n-1
;i++) //陣列下標從0開始,對n個記錄進行n-1趟排序 { index=i; //查詢最小值 for(j=i+1;j<n;j++) //在無序區中找最小記錄 { if(r[j]<r[index]) index=j; } if(index!=i) swap(&A[min],&A[i]); //若最小記錄不在最終位置則交換 }

該演算法的基本語句是內迴圈體中的比較語句r[j]<r[index]

,其執行次數為:

i=0n2j=i+1n11=i=0n2(ni)=n(n1)/2=O(n2)
因此,選擇排序演算法的時間效能為O(n2)

簡單選擇排序舉例

<初態> 49 38 65 97 76 49 13 27
<第1趟> 13 38 65 97 76 49 49 27
<第2趟> 13 27 65 97 76 49 49 38
<第3趟> 13 27 38 97 76 49 49 65
<第4趟> 13 27 38 49 76 97 49 65
<第5趟> 13 27 38 49 49 97 76 65
<第6趟> 13 27 38 49 49 65 76 97
<第7趟> 13 27 38 49 49 65 76 97
(每趟排序使有序區增加一個記錄)

驗證結果

原始碼

#include "stdafx.h"
#include<time.h>
#include<iomanip>
#include<iostream>
using namespace std;

const int N = 10;
int main()
{
    int a[N], i, j, temp, b;
    srand(time(NULL));
    for (i = 0; i < N; i++)
        a[i] = rand() % 100;
    cout << "原始序列為: "<<endl;
    for (i = 0; i<N; i++)
        cout << setw(3) << a[i];
    cout << endl;
    for (i = 0; i<N - 1; i++)
    {
        temp = i;
        for (j = i + 1; j<N; j++)
        {
            if (a[temp]>a[j])
                temp = j;
        }
        if (i != temp)
        {
            b = a[temp];
            a[temp] = a[i];
            a[i] = b;
        }
    }
    cout << "經過選擇排序後的序列為: "<<endl;
    for (i = 0; i<N; i++)
        cout << setw(3) << a[i];
    cout << endl;
}