1. 程式人生 > 程式設計 >C++實現選擇性排序(SelectionSort)

C++實現選擇性排序(SelectionSort)

“選擇性排序”是數列排序的演算法之一。
其思路引點來源於經典的“可樂雪碧問題”

“現有兩杯飲料,一杯是雪碧,一杯是可樂,試問如何可以將兩杯飲料交換?”
“答:最簡單的解決方案就是利用一個空杯,創造一個快取區。”

選擇性排序就是利用線性搜尋數列並找到當前最小值,通過不斷的將當前最小值放置當前位置索引的演算法。

1、演算法思路

C++實現選擇性排序(SelectionSort)

這是一個未排序的數列。

C++實現選擇性排序(SelectionSort)

首先,線性搜尋數列,找到最小值。

C++實現選擇性排序(SelectionSort)

將最小值替換為列中左端的數字並進行排序,如果最小值已經在左端,則不執行任何操作。

C++實現選擇性排序(SelectionSort)

重複相同操作,直到所有的數字都被排序。

3、動畫演示

C++實現選擇性排序(SelectionSort)

4、程式碼清單及其測試結果

#include <iostream>
template <class T>

int getSizeOfArray(T& ss){
 return sizeof(ss)/ sizeof(ss[0]);
}

void selectionSort(int * ss,int size){
 for(int i=0;i<size-1;i++){
 int minimalIndex = i;//初始化當前範圍內最小值索引
 for(int j=i+1;j<size;j++){//查詢當前範圍內最小值索引
  if(ss[j]<ss[minimalIndex]){
  minimalIndex = j;
  }
 }
 if(minimalIndex!=i){//如果當前範圍內最小值索引不為初始化索引,才進行交換
  int cup = 0;
  cup = ss[i];
  ss[i] = ss[minimalIndex];
  ss[minimalIndex] = cup;
 }
 }
}


int main() {
 using namespace std;

 int ss[] = {2,3,5,1,8,6,9,7};
 int size = getSizeOfArray(ss);

 cout<< "原數列:";

 for(int i = 0;i<size;i++)
 {
 cout<< ss[i] << " ";
 }

 cout<< "\n" << "選擇性排序後:";

 selectionSort(ss,size);

 for(int i = 0;i<size;i++)
 {
 cout<< ss[i] << " ";
 }

 return 0;
}

C++實現選擇性排序(SelectionSort)

6. 演算法分析

時間複雜度

選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。
比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+…+1=n*(n-1)/2。交換次數O(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比氣泡排序快。

穩定性

選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。 [1]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。