1. 程式人生 > >選擇排序(SelectSort)思想與實現

選擇排序(SelectSort)思想與實現

  選擇排序屬於相對來說比較簡單的排序方法,時間複雜度為:O(n^2)。

(1) 選擇排序的思想

  選擇排序的思想就是:選擇排序的本意在於每次選擇出最小或者最大的元素,將其放在陣列的前面,從而使得陣列呈現升序或者降序。以排升序為例,從陣列的第0個元素開始,我們的目的是要將陣列中最小的元素放在第0個元素的位置,在此前提下進行接下來的操作。開始我們認為第0個元素是陣列中最小的元素,然後第1個元素開始往後遍歷,假如搜尋到第n個元素時,發現比第0個元素小,我們將第n個元素和第0個元素進行交換,這時候第0個元素是目前最小的元素;之後,再繼續從第n+1個元素往後遍歷,遇到比第0個元素小的元素就進行交換,否則繼續往後遍歷,直到遍歷到最後一個元素為止,這時候第0個元素就為陣列中最小的元素。同理,第1個元素也進行同樣的操作,開始認為第1元素是從第1個元素到最後一個元素中最小的元素,然後從第2個元素往後遍歷,選擇出最小的元素放入第1個元素的位置。以此類推,排好之後的陣列元素的順序。

為了更好地理解該演算法,我們來看下面的圖片:

由上圖可知,原始的陣列為:5   2   3   8   1,接下來,我們進行分步操作。

  第一步:將最小元素的下標least賦值為0(即認為第least個元素最小,注意:least為元素的下標),然後從第1個元素開始往後遍歷,發現第1個元素2比第0個元素5小,然後將least賦值為1,第least個元素為2;之後遍歷到第2個元素,發現第2個元素3比第least元素2大,不做操作,繼續往後遍歷,遍歷到最後一個元素(即第4個元素)1,發現比第least個元素小,之後將least賦值為4,第least個元素為1;由於遍歷到了最後一個元素,故將第least個元素的值1和第0個元素的值5進行交換,陣列變成:1  2  3  8  5。

  第二步:將最小元素的下標least賦值為1,即認為從第1個元素到最後一個元素中,最小的元素為2。然後從第2個元素開始往後遍歷,發現沒有比2小的元素,故不做操作,陣列為:1  2  3  8  5。

  第三步:將最小元素的下標least賦值為2,即認為從第2個元素到最後一個元素中,最小的元素為3。然後從第3個元素開始往後遍歷,發現沒有比3小的元素,故不做操作,陣列為:1  2  3  8  5。

  第四步:將最小元素的下標least賦值為3,即認為從第3個元素到最後一個元素中,最小的元素為8。然後從第4個元素開始往後遍歷,發現第4個元素5比8小,故將least賦值為4,由於遍歷到了最後一個元素,將第least個元素5和第3個元素進行交換,陣列變成:1  2  3  5  8。

  最後,由於此時陣列最後一個元素必為最大的元素,故排序完成。

(2) 選擇排序的實現

  本次採用C++的模版程式設計來實現該演算法。

#include <iostream>
#include <iterator>

using namespace std;


template<class T,size_t N>
void PrintArr(T (&arr)[N]) {
	copy(arr,arr+N,ostream_iterator<T>(cout," "));
	cout << endl;
}

template<class T,size_t N>
void SelectSort(T (&arr)[N]) {
	for(size_t i=0,j,least; i<N-1; i++) {
		for(j=i+1,least = i; j<N; j++) {
			if(arr[j] < arr[least]) {
			least = j;
			}
		}
		swap(arr[least],arr[i]);
	}
}

template<class SortFunc>
void Test(SortFunc sort) {
	int arr[]= {5,2,3,8,1};
	cout << "SelectSort:"<<endl;
	sort(arr);
	PrintArr(arr);
}
   
int main(){
	Test(SelectSort<int,5>);
}

原始陣列為:5  2  3  8  1

程式執行結果為:1  2  3  5  8