經典算法(一)----冒泡排序----圖解法讓你快速入門

引言

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

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

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

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

什麼是冒泡排序?

下面看百度百科對冒泡排序的定義:

冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。

它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。

 

冒泡冒泡,顧名思義它的排序過程就像冒泡一樣,它的基本思想就是:對所有的數進行查找,找到最大的數放到最後面, 接下來除了那個最大的數,再對剩餘的數進行查找,把剩餘的數中最大的數放到倒是第二後面,直到所有的數都排序完成。

冒泡排序的大概過程是什麼?

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

冒泡排序的基本思想就是:首先選出來最大的數放到最後面,再選出來第二大的放到最大的數前面,按照前面的方法知道排序完成。

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

  1. 我們首先要選出來這個五個數中最大,選擇方法:首先看第一個數3和第二個數1,拿着3和1比較,發現3>1,交換他倆的位置,這時候這一組數就變成了1,3,5,2,4
  2. 再看交換後的第二個數3和第三個數5,發現3<5.符合從小到大,不用交換順序。
  3. 再看交換後的第三個數5和第四個數2,發現5>2,交換他倆的位置,這時候這一組數就變成了1,3,2,5,4.
  4. 再看交換後的第四個數5和第五個數4,發現5>4,交換他倆的位置,這時候這一組數就變成了1,3,2,4,5
  5. 上面的這四步算是第一輪查找,把最大的數字5放到了最後面。下面在及性能第二輪查找
  6. 首先看第一個數1和第二個數3,發現1<3,符合條件,不用交換順序
  7. 再看第二個數3和第三個數2,發現3>2,交換他倆的位置,這時候這一組數就變成了1,2,3,4,5。
  8. 再看第三個數3和第四個數4,發現3<4,符合條件,不用交換順序。
  9. 到現在爲止第二輪的查找結束(不用對第五個數5進行比較,因爲他已經是最大的了),通過上面的6-8,把第二大的數4放到了倒數第二個位置。接下來按照上面方法再進行查找即可。

總結:假設一共有n個數,那麼需要n-1上面的查找操作(每一次都會把 “最大的數放到後面”,等進行n-1一次之後,剩餘的1個數不用比較也是最小的數了),而且每一次查找過程中,比較相鄰兩個數的次數還不一樣,第一次需要比較n-1次,第二次需要n-2(最後一個數已經確定,不用比較了)。後面的每次查找都比前面查找的比較次數少一,即第i次查找過程,需要比較n-i次(重要!!!)。

下面再看一個網上冒泡排序的動圖:

 怎樣用代碼實現冒泡排序?

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

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

搞清楚了上面三個條件,我們下面看代碼:

#include<iostream>
using namespace std;
//冒泡排序函數    穩定 
void BubbleSort(int arr[],int len)
{
	int temp;
	for(int i=0;i<len-1;i++)
	{
		for(int j=0;j<len-i-1;j++)
		{
			if(arr[j]>arr[j+1])//交換這兩個數 
			{
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=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;//要排序的數組長度 
	
	//排序 
	BubbleSort(arr,len);
	
	//輸出 
	printf(arr,len);
	return 0;
}

運行結果:

 

冒泡排序的代碼詳解

  1. 上面代碼寫了兩個函數,一個是printf函數,這個是輸出排序後的數組。
  2. 另一個函數就BubbleSort函數,在這個函數裏面有一個二重循環,外層循環的的次數就是要查找的次數,內層循環的次數的就是要比較的次數,剛好對應上面說的(這裏數組下標是從0開始的)。
  3. 如果對上面代碼有疑問,自己可以按照前面的過程,模擬一邊對3,1,4,5,2的排序過程,就知道代碼是怎樣執行的了 。

本文參考以及引用:

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