首先說一下冒泡排序的基本算法思想:
它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。
這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
以從小到大排序為例:a[5]={3,5,4,1,0};
- 先將3和5進行比較,已經(jīng)是我們需要的正序,不需要交換位置;
- 再將5和4進行比較,不是正序,相互交換順序,序列變?yōu)閧3,4,5,1,0}。
- 再將5和1進行比較,不是正序,相互交換順序,序列變?yōu)閧3,4,1,5,0}。
- 再將5和0進行比較,不是正序,相互交換順序,序列變?yōu)閧3,4,1,0,5}。
至此,第1輪冒泡就已經(jīng)完成了,最大值5到了序列的最后面。
由于5的位置已經(jīng)排好序,所以第2輪,5不再參與排序,將{3,4,1,0}置為有序序列即可。
假設數(shù)組元素個數(shù)為n,從上面第1輪的比較來看,我們可以得出如下結論:
- 我們將冒泡排序的輪數(shù)設為 i ,每完成1輪冒泡排序,就會增加一個元素處于有序狀態(tài),所以在 (n-1) 輪排序結束后,就會有 n-1 個元素處于有序狀態(tài),而剩下的最后一個元素,自然是最?。ù螅┲?,不用再進行排序,所以,冒泡排序比較的輪數(shù)為 (n-1)?。
- 我們將每輪需要比較的次數(shù)設為 j ,第1輪( i 值為0)需要比較的次數(shù)為4,從?{3,4,1,0} 中不難看出,第2輪( i 值為1)需要比較的次數(shù)為3次,說明每輪比較的次數(shù) j 與冒泡的輪數(shù)? i? 值有關,且 j = n-i-1。
確定好上面兩條結論以后,我們開始用代碼實現(xiàn)冒泡排序算法:文章來源:http://www.zghlxwxcb.cn/news/detail-400036.html
#include <iostream>
using namespace std;
//對a[]進行正序(從小到大)排序
void bubblesort(int *a,int len) //形參a取到實參a傳遞過來的數(shù)組首地址
//然后解引用,取到數(shù)組的值
{
for (int i=0;i<len-1;i++) //i控制排序的輪數(shù)
{
for (int j=0;j<len-i-1;j++) //j控制每輪需要比較的次數(shù)
{
if(a[j+1]<a[j]) //不滿足正序要求,交換順序
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
int main()
{
int a[10]={2,6,3,8,5,1,0,7,9,4};
int len = sizeof(a)/sizeof(int); // 計算數(shù)組元素個數(shù)
bubblesort(a,len); //a為數(shù)組a[10]首地址,作為實參傳遞給形參
for(int i=0;i<len;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
得到正序排列的值:?0 1 2 3 4 5 6 7 8 9。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-400036.html
到了這里,關于C++常見排序算法——冒泡排序算法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!