經典算法(二)----選擇排序----圖解法讓你快速入門

引言

     只要設計到數據,就會涉及到數據的排序問題,比如給你隨機給你五個整數  3,1,5,2,4 。讓你從小到大進行排序,那我們該怎樣纔是實現對這些整數的排序呢 ?

    答案是多種多樣的,比如用冒泡排序、選擇排序、堆排序、歸併排序、快速排序等等,這些排序方法都可以實現對整數排序,而這篇文章要講的就是選擇排序

本文將從以下幾個問題對選擇排序進行分析和講解:

  1. 什麼是選擇排序?
  2. 選擇排序的大概過程是什麼?
  3. 怎樣用代碼實現選擇排序?
  4. 選擇排序的代碼詳解。

什麼是選擇排序?

下面看百度百科對選擇排序的定義:

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是:第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的數據元素的個數爲零。選擇排序是不穩定的排序方法。

簡單來說:選擇排序就是經過一輪一輪的查找,每一輪都從待排序的元素中選擇一個最小的(或最大的)元素,存放在起始位置,直接排序完成位置。

下面看一個動圖:

選擇排序的大概過程是什麼?

下面拿一個例子說明選擇排序的大概過程。

選擇排序的基本思想就是:首先選出來最小的數放到最前面,再選出來第二小的數放到最小的數前面,按照前面的方法直到排序完成。

下面來說用選擇排序對3,1,5,2,4進行排序(從小到大排序)

  1. 首先用一個變量minx記錄3的下標,拿着minx對應的數字3和第二個數字1比較,發現1小,那數字1的下標存入minx中。
  2. 繼續拿着minx的數字1和第三個數字5進行比較,發現5大於1,不做處理。
  3. 繼續拿着minx的數字1和第四個數字2進行比較,發現2大於1,不做處理。
  4. 繼續拿着minx的數字1和第五個數字4進行比較,發現4大於1,不做處理。
  5. 截止到現在爲止,已經找到了最小數的下標minx,讓這組數的第一個數和這個minx對應下標的值進行交換即可,這樣就把最小的數放到了第一個位置,這時候這組數據變成了1,3,5,2,4.
  6. 下面開始第二輪,尋找剩餘元素的最小數。
  7. 首先把第二個數的下標存入minx,拿着minx的數字3和第三個數字5進行比較,發現5大於3,不做處理。
  8. 繼續拿着minx的數字3和第四個數字2進行比較,發現3大於2,那就把3的下標存入到minx中。
  9. 繼續拿着minx的數字2和第五個數字4進行比較,發現4大於2,不做處理。
  10. 截止到現在爲止,已經找到了最小數的下標minx,讓這組數的第二個數和這個minx對應下標的值進行交換即可,這樣就把最小的數放到了第二個位置,這時候這組數據變成了12,5,3,4。
  11. 下面繼續重複上面的操作即可。

總結:選擇排序是每次找到一個最小的數,放到前面,假如有n個元素需要排序,那麼只需要n-1輪查找即可,因爲最後一個數不處理,也會把最大的數剩餘到最後面。而且每輪的查找次數也是有規律的,比如第 i 輪查找,只要比比較n-i-1次即可(重要★★★)

 怎樣用代碼實現選擇排序?

通過上面對3,1,5,2,4的排序過程講解,我們需要明確已知的三個條件

  1. 我們要排序的數組有哪些數?數組長度爲多少?
  2. 我們要查找的次數爲多少?
  3. 每次查找,我們需要比較的次數爲多少?

搞清楚了上面三個條件,我們下面我們動圖數據排序的實現代碼:

#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的排序過程,就知道代碼是怎樣執行的了 。

本文參考以及引用:

百度百科

圖片動畫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章