八大排序———選擇排序
阿新 • • 發佈:2018-12-12
一:選擇排序的原理
n個數據的檔案可經過n-1趟直接選擇排序得到有序結果。
①初始狀態:無序區 R[1....n] ,有序區為空。
②第一趟排序:在無序區R[1....n]選出下標最小的記錄R[1],通過比較獲得無序區中最小的,將他與無序區的第一個記錄R[1]交換,使得R[1..1]和R[2...n]成為新的有序區域,和新的無序區域。
③第i趟排序:第i趟開始時,有序區域R[1......i-1],無序區為R[i....n],該趟排序是從無序區中選擇下標最小的記錄R[i],和無序區中資料比較獲得最小的R[k]和R[i]交換.使得新的有序區域加一。R[1...i]。
二:演算法描述
#include<iostream> using namespace std; template<typename T> void selectsort(T arr[],int len) { T temp = T(); for(int i=0;i<len-1;i++) { temp = arr[i];//記錄從頭開始的元素, int pos = i;//記錄位置 for(int j=i+1;j<len;++j)//從下一個位置開始 { if(arr[j]>temp)//改變temp的資訊 { temp = arr[j]; pos = j; } } arr[pos] = arr[i]; arr[i] = temp; } } int main() { int arr[]={15,49,89,2,46,61,35,35,49,9,41}; int len = sizeof(arr)/sizeof(arr[0]); selectsort(arr,len); for(int i=0;i<len;++i) { cout<<arr[i]<<" "; } cout<<endl; double brr[]={15.2,16.9,48.3,2.2,16.3,5,4.6,15.32}; int len1 = sizeof(brr)/sizeof(brr[0]); selectsort(brr,len1); for(int j=0;j<len1;++j) { cout<<brr[j]<<" "; } cout<<endl; return 0; }
三:時間複雜度
選擇排序的交換操作介於0和(n-1)次之間(每趟比較都要比較一次)。選擇排序的比較操作為n-1 + n-2 +n-3 ..........1 =>n(n-1)/2次之間。
所以比較次數O(n^2),而交換次數O(n),最好的情況是,已經有序,交換0次;最壞的情況是交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需要CPU時間比比較所需的CPU時間多,n較小時,選擇排序比氣泡排序快。
四:穩定性
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,一次類推,直到第n-1個元素,第n個元素就不用選擇了,因為只剩下它一個最大的元素了。
那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。例如:序列5 8 5 2 9,我們知道第一遍選擇第一個元素5會和2交換,那麼原序列中兩個5的相對順序就被破壞了,所以選擇排序是一個不穩定的演算法。
五:樹形選擇排序
待更新