引言
只要設計到數據,就會涉及到數據的排序問題,比如給你隨機給你五個整數 3,1,5,2,4 。讓你從小到大進行排序,那我們該怎樣纔是實現對這些整數的排序呢 ?
答案是多種多樣的,比如用冒泡排序、選擇排序、堆排序、歸併排序、快速排序等等,這些排序方法都可以實現對整數排序,而這篇文章要講的就是選擇排序
本文將從以下幾個問題對選擇排序進行分析和講解:
- 什麼是選擇排序?
- 選擇排序的大概過程是什麼?
- 怎樣用代碼實現選擇排序?
- 選擇排序的代碼詳解。
什麼是選擇排序?
下面看百度百科對選擇排序的定義:
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是:第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的數據元素的個數爲零。選擇排序是不穩定的排序方法。
簡單來說:選擇排序就是經過一輪一輪的查找,每一輪都從待排序的元素中選擇一個最小的(或最大的)元素,存放在起始位置,直接排序完成位置。
下面看一個動圖:
選擇排序的大概過程是什麼?
下面拿一個例子說明選擇排序的大概過程。
選擇排序的基本思想就是:首先選出來最小的數放到最前面,再選出來第二小的數放到最小的數前面,按照前面的方法直到排序完成。
下面來說用選擇排序對3,1,5,2,4進行排序(從小到大排序)
- 首先用一個變量minx記錄3的下標,拿着minx對應的數字3和第二個數字1比較,發現1小,那數字1的下標存入minx中。
- 繼續拿着minx的數字1和第三個數字5進行比較,發現5大於1,不做處理。
- 繼續拿着minx的數字1和第四個數字2進行比較,發現2大於1,不做處理。
- 繼續拿着minx的數字1和第五個數字4進行比較,發現4大於1,不做處理。
- 截止到現在爲止,已經找到了最小數的下標minx,讓這組數的第一個數和這個minx對應下標的值進行交換即可,這樣就把最小的數放到了第一個位置,這時候這組數據變成了1,3,5,2,4.
- 下面開始第二輪,尋找剩餘元素的最小數。
- 首先把第二個數的下標存入minx,拿着minx的數字3和第三個數字5進行比較,發現5大於3,不做處理。
- 繼續拿着minx的數字3和第四個數字2進行比較,發現3大於2,那就把3的下標存入到minx中。
- 繼續拿着minx的數字2和第五個數字4進行比較,發現4大於2,不做處理。
- 截止到現在爲止,已經找到了最小數的下標minx,讓這組數的第二個數和這個minx對應下標的值進行交換即可,這樣就把最小的數放到了第二個位置,這時候這組數據變成了1,2,5,3,4。
- 下面繼續重複上面的操作即可。
總結:選擇排序是每次找到一個最小的數,放到前面,假如有n個元素需要排序,那麼只需要n-1輪查找即可,因爲最後一個數不處理,也會把最大的數剩餘到最後面。而且每輪的查找次數也是有規律的,比如第 i 輪查找,只要比比較n-i-1次即可(重要★★★)
怎樣用代碼實現選擇排序?
通過上面對3,1,5,2,4的排序過程講解,我們需要明確已知的三個條件
- 我們要排序的數組有哪些數?數組長度爲多少?
- 我們要查找的次數爲多少?
- 每次查找,我們需要比較的次數爲多少?
搞清楚了上面三個條件,我們下面我們動圖數據排序的實現代碼:
#include<iostream> using namespace std; //選擇排序函數 不穩定 void SelectionSort(int arr[],int len) { int temp; for(int i=0;i<len-1;i++) { int minx=i; for(int j=i+1;j<len;j++) { if(arr[j]<arr[minx]) //尋找最小的數 minx=j; //記錄對應的下標 } temp=arr[i]; arr[i]=arr[minx]; arr[minx]=temp; } } //輸出數組的值 void printf(int arr[],int len) { for(int i=0;i<len;i++) cout<<arr[i]<<" "; cout<<endl; } int main() { //要排序的數組 int arr[]={3, 44,38, 5,47,15,36,26,27,2 ,46,4 ,19,50,48}; int len=15;//要排序的數組長度 //排序 SelectionSort(arr,len); //輸出 printf(arr,len); return 0; }
運行結果:
選擇排序的代碼詳解
上面代碼寫了兩個函數,一個是printf函數,這個是輸出排序後的數組。
另一個函數就SelectionSort函數,在這個函數裏面有一個二重循環,外層循環的的次數就是要查找的次數,內層循環的次數的就是要比較的次數,剛好對應上面說的(這裏數組下標是從0開始的)。
如果對上面代碼有疑問,自己可以按照前面的過程,模擬一邊對3,1,4,5,2的排序過程,就知道代碼是怎樣執行的了 。本文參考以及引用: