1、氣泡排序的概念網上一大堆,這裡也就不複製了。下面主要是我的一些理解,算是在此做個筆記吧!
2、「冒泡」是乙個很形象的比喻,下面先看一段簡單的**:
int
nnum = ;
int
ncount =
sizeof
(nnum) /
sizeof
(nnum[0]);
int
nmax = nnum[0];
for
(
int
i = 1; i
這段**很簡單,執行的結果是找出一組數中的最大值,執行完後nmax應該等於9;
3、根據上述**,那麼要實現排序,即將一組數由大到小(降序)排列或是由小到大(公升序)排列,只要重複上述**就可以了。具體如下(以找出大值為例):
(1)從一組數中找出最大的數,並儲存,執行步驟(2);
(2)將(1)中找出的數從這組數中剔除,執行步驟(3);
(3)判斷這組數的個數是否小於2,若否,則執行(1),若是,則確定大小完成,執行(4);
(4)根據要求(公升序還是降序)給出結果;
注意:如果待排序數原有n個,那麼找出最大值的操作要執行n-1次;
4、上述邏輯演算法有了,但是在實現(2)的時候遇到了問題,如何真正移除乙個陣列中的元素?這個問題顯然不是一兩句話能說清楚的,這裡就換一種實現方式:
為了簡便,將待排序數放入vector中。
5、實現**如下(貌似有點繞):
// bubble_sort_test.cpp : 定義控制台應用程式的入口點。
//
#include "stdafx.h"
#include
#include
using
namespace
std;
int
_tmain(
int
argc, _tchar* argv)
;
// 待排序數的個數
const
int
ncount =
sizeof
(nnum) /
sizeof
(nnum[0]);
// 用vector儲存待排序數
vector <
int
> vectornum;
for
(
int
i = 0; i
// 用於儲存排序結果
int
nsort[ncount] = ;
// 排序
for
(
int
i = 0; i// ncount個數,需要求最大值ncount-1次
nsort[i] = nmax;
// 儲存
vectornum.erase(vectornum.begin() + npos);
// 剔除最大值
}
// 最後乙個數的操作
nsort[ncount - 1] = *vectornum.begin();
vectornum.clear();
// 列印
for
(
int
i = 0; i
getchar
();
return
0;
}
6、上述過程略顯複雜,但是思路卻是冒泡演算法的基礎,實際上冒泡演算法也是這樣一次一次求最大值,只不過這個求的過程中有乙個巧妙的地方:它把一趟求最大值的過程,實現為一趟兩兩交換的過程,最大值自然地被換到了陣列的末尾。以為例:
通過以上9次大小比較,進而交換位置,最後將最大值放到的末尾。
7、根據上述示例,可以這樣實現乙個排序演算法:
(1)從一組數中找出最大的數:通過交換位置,將其放到末尾(這一過程就是冒一次泡),執行步驟(2);
(2)將這組數的個數減1,執行步驟(3);
(3)若冒泡次數小於待排序數的個數減1,執行(1);否則,排序完成。
注意:如果待排序數原有n個,那麼要冒泡n-1次;而如果每次冒泡需要交換資料的個數為m,則需要交換m-1次。
8、實現**:
int
_tmain(
int
argc, _tchar* argv)
;
// 待排序數的個數
const
int
ncount =
sizeof
(nnum) /
sizeof
(nnum[0]);
// 氣泡排序
for
(
int
i = 0; i// ncount個數,冒泡ncount-1次
cout <
}
cout <
}
// 輸出結果
排序演算法 1 氣泡排序
氣泡排序是非常容易理解和實現,以從小到大排序舉例 設陣列長度為n。1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。2 這樣對陣列的第0個資料到n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第n 1個位置。3 n n 1,如果n不為0就重複前面二步,否則排序完成。冒...
排序演算法1 氣泡排序
氣泡排序 public class bubblesort int arr 交換變數 int temp 判斷上一次是否進行了排序,若上次沒有進行排序,證明排序已經提前完成,可提前跳出迴圈,結束排序 boolean flag false for int i 0 i arr.length 1 i if f...
排序演算法1 氣泡排序
1.什麼是氣泡排序 氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他 們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交 換慢慢 浮 ...