引言
只要設計到數據,就會涉及到數據的排序問題,比如給你隨機給你五個整數 3,1,5,2,4 。讓你從小到大進行排序,那我們該怎樣纔是實現對這些整數的排序呢 ?
答案是多種多樣的,比如用冒泡排序、選擇排序、堆排序、歸併排序、快速排序等等,這些排序方法都可以實現對整數排序,而這篇文章要講的就是冒泡排序
本文將從以下幾個問題對冒泡排序進行分析和講解:
- 什麼是冒泡排序?
- 冒泡排序的大概過程是什麼?
- 怎樣用代碼實現冒泡排序?
- 冒泡排序的代碼詳解。
什麼是冒泡排序?
下面看百度百科對冒泡排序的定義:
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
冒泡冒泡,顧名思義它的排序過程就像冒泡一樣,它的基本思想就是:對所有的數進行查找,找到最大的數放到最後面, 接下來除了那個最大的數,再對剩餘的數進行查找,把剩餘的數中最大的數放到倒是第二後面,直到所有的數都排序完成。
冒泡排序的大概過程是什麼?
下面拿一個例子說明冒泡排序的大概過程。
冒泡排序的基本思想就是:首先選出來最大的數放到最後面,再選出來第二大的放到最大的數前面,按照前面的方法知道排序完成。
下面來說用冒泡排序對3,1,5,2,4進行排序(從小到排序)
- 我們首先要選出來這個五個數中最大,選擇方法:首先看第一個數3和第二個數1,拿着3和1比較,發現3>1,交換他倆的位置,這時候這一組數就變成了1,3,5,2,4
- 再看交換後的第二個數3和第三個數5,發現3<5.符合從小到大,不用交換順序。
- 再看交換後的第三個數5和第四個數2,發現5>2,交換他倆的位置,這時候這一組數就變成了1,3,2,5,4.
- 再看交換後的第四個數5和第五個數4,發現5>4,交換他倆的位置,這時候這一組數就變成了1,3,2,4,5
- 上面的這四步算是第一輪查找,把最大的數字5放到了最後面。下面在及性能第二輪查找
- 首先看第一個數1和第二個數3,發現1<3,符合條件,不用交換順序
- 再看第二個數3和第三個數2,發現3>2,交換他倆的位置,這時候這一組數就變成了1,2,3,4,5。
- 再看第三個數3和第四個數4,發現3<4,符合條件,不用交換順序。
- 到現在爲止第二輪的查找結束(不用對第五個數5進行比較,因爲他已經是最大的了),通過上面的6-8,把第二大的數4放到了倒數第二個位置。接下來按照上面方法再進行查找即可。
總結:假設一共有n個數,那麼需要n-1上面的查找操作(每一次都會把 “最大的數放到後面”,等進行n-1一次之後,剩餘的1個數不用比較也是最小的數了),而且每一次查找過程中,比較相鄰兩個數的次數還不一樣,第一次需要比較n-1次,第二次需要n-2(最後一個數已經確定,不用比較了)。後面的每次查找都比前面查找的比較次數少一,即第i次查找過程,需要比較n-i次(重要!!!)。
下面再看一個網上冒泡排序的動圖:
怎樣用代碼實現冒泡排序?
通過上面對3,1,5,2,4的排序過程講解,我們需要明確已知的三個條件
- 我們要排序的數組有哪些數?數組長度爲多少?
- 我們要查找的次數爲多少?
- 每次查找,我們需要比較的次數爲多少?
搞清楚了上面三個條件,我們下面看代碼:
#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; }
運行結果:
冒泡排序的代碼詳解
- 上面代碼寫了兩個函數,一個是printf函數,這個是輸出排序後的數組。
- 另一個函數就BubbleSort函數,在這個函數裏面有一個二重循環,外層循環的的次數就是要查找的次數,內層循環的次數的就是要比較的次數,剛好對應上面說的(這裏數組下標是從0開始的)。
- 如果對上面代碼有疑問,自己可以按照前面的過程,模擬一邊對3,1,4,5,2的排序過程,就知道代碼是怎樣執行的了 。
本文參考以及引用: