今天學(xué)習(xí)了冒泡排序,我開始還納悶怎么書上沒有冒泡排序!結(jié)果是我的看書不認(rèn)真,給漏掉了,這次補(bǔ)上。呵呵。
冒泡排序的主要思路:
我們把要排序的數(shù)組A = {3,4,2,1} 看成一組水泡, <!--[endif]-->就像冒泡一樣,輕的在上面,重的在下面,換成數(shù)據(jù),就是小的在上面,大的在下面。 我們先把最輕的冒出到頂端,然后冒出第二輕的在最輕的下面,接著冒出第三輕的。依次內(nèi)推。直到所有都冒出來了為止。
3.我們?cè)趺醋龅桨炎钶p的放在頂端呢?我們從最底下的數(shù)據(jù)開始冒,如果比他上面的數(shù)據(jù)小,就交換(冒上去),然后再用第二第下的數(shù)據(jù)比較(此時(shí)他已經(jīng)是較輕的一個(gè)),如果他比他上面的小,則交換,把小的冒上去。直到比到第一位置,得到的就是最輕的數(shù)據(jù)咯,這個(gè)過程就像是冒泡一樣,下面的和上面的比較,小的冒上去。大的沉下來。呵呵。
畫個(gè)圖先:
最初
|
第一次結(jié)果
|
第二次結(jié)果
|
第三次結(jié)果
|
3
|
3
|
3
|
1
|
4
|
4
|
1
|
3
|
2
|
1
|
4
|
4
|
1
|
2
|
2
|
2
|
開始:1 和2 比,1比2小,浮上,然后1跟4比,再1跟3比,這樣結(jié)構(gòu)就變?yōu)?,3,4,2。最小的位置確定了,然后我們確定第二小的,同理2 vs 4, 2 vs 3 得到2, 再確定第3小數(shù)據(jù),3 vs 4得到3,最后就是4為最大的數(shù)據(jù),我們冒泡就排好了。
注:這里紅色的1,2是前一次比較1 vs 2交換的結(jié)構(gòu)。后面也一樣。
大概思路就這樣了,奉上源代碼:
#include <stdio.h>
#include <stdlib.h>
//冒泡排序, pnData要排序的數(shù)據(jù), nLen數(shù)據(jù)的個(gè)數(shù)
int BubbleSort(int* pnData, int nLen)
{
bool isOk = false; //設(shè)置排序是否結(jié)束的哨兵
//i從[0,nLen-1)開始冒泡,確定第i個(gè)元素
for (int i = 0; i < nLen - 1 && !isOk; ++i)
{
isOk = true; //假定排序成功
//從[nLen - 1, i)檢查是否比上面一個(gè)小,把小的冒泡浮上去
for (int j = nLen- 1; j > i; --j)
{
if (pnData[j] < pnData[j - 1]) //如果下面的比上面小,交換
{
int nTemp = pnData[j];
pnData[j] = pnData[j - 1];
pnData[j - 1] = nTemp;
isOk = false;
}
}
}
return 1;
}
int main()
{
int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //創(chuàng)建10個(gè)數(shù)據(jù),測(cè)試
BubbleSort(nData, 10); //調(diào)用冒泡排序
for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}
printf("\n");
system("pause");
return 0;
}
我這里用了一個(gè)哨兵做標(biāo)記,就是如果在已經(jīng)是排好序的情況下我們能檢測(cè)出來并退出。隨便說一下,冒泡排序是穩(wěn)定的排序。