演算法設計與分析之選擇排序
阿新 • • 發佈:2019-02-05
基本思想
選擇排序開始的時候,掃描整個序列,找到整個序列的最小記錄和序列中的第一個記錄交換,從而將最小記錄放到它在有序區的最終位置上,然後再從第二個記錄開始掃描序列,找到n-1個序列中的最小記錄,再和第二個記錄交換記錄。
一般地,第趟排序從第個記錄開始掃描序列,在記錄中找到關鍵碼最小的記錄,並和第個記錄交換作為有序序列的第個記錄。如下圖所示:
選擇排序演算法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]
因此,選擇排序演算法的時間效能為。
簡單選擇排序舉例
<初態> 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;
}