冒泡排序是排序算法的一種,思路清晰,代碼簡(jiǎn)潔,常被用在大學(xué)生計(jì)算機(jī)課程中?!懊芭荨边@個(gè)名字的由來(lái)是因?yàn)樵酱蟮脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端,故名。這里以從小到大排序?yàn)槔M(jìn)行講解?;舅枷爰芭e例說(shuō)明
目前創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、建陽(yáng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
冒泡排序的基本思想就是不斷比較相鄰的兩個(gè)數(shù),讓較大的元素不斷地往后移。經(jīng)過(guò)一輪比較就,選出最大的數(shù);經(jīng)過(guò)第2輪比較,就選出次大的數(shù),以此類推。下面以對(duì) 3 2 4 1 進(jìn)行冒泡排序說(shuō)明。
1.這個(gè)算法用rand函數(shù)產(chǎn)生新的要排序的數(shù)據(jù),與已有的有序數(shù)列中的數(shù)據(jù)依次比較,如果遇到比他大的數(shù)據(jù),就從該數(shù)據(jù)開始,一直交換到末尾,達(dá)到一個(gè)插入的效果。從而形成有序的數(shù)列。
2.此外,只用rand函數(shù)并不能達(dá)到真正隨機(jī)的效果。如果要實(shí)現(xiàn)真正隨機(jī)的效果,還要配合srand函數(shù)才行。
3.具體代碼如下:#include "stdio.h"#include "stdlib.h"void main(){int a[10],temp,r; printf("請(qǐng)輸入一個(gè)種子\n"); scanf("%d",r);srand(r); for(int i=0;i9;i++) 。
#include?iostream
using?namespace?std;
//從小到大排序
template?typename?T
void?Bubble(T?arr[],?int?n)
{
//冒泡
int?i,j;
for?(i=0;?in;?i++)
for?(j=0;?jn-i-1;?j++)
{
if?(arr[j]??arr[j+1])
{
T?temp;
temp?=?arr[j];
arr[j]?=?arr[j+1];
arr[j+1]?=?temp;
}
}
for?(i=0;?in;?i++)
cout??arr[i]??endl;
}
//從小到大排序
template?typename?T
void?Insert(T?arr[],?int?n)
{
//插入排序
int?i,j,pos;
T?temp;
for?(i=0;?in;?i++)
{
pos?=?i;
for?(j=i;?jn;?j++)
{
if?(arr[j]??arr[pos])
{
pos?=?j;
temp?=?arr[j];
arr[j]?=?arr[pos];
arr[pos]?=?temp;
}
}
temp?=?arr[i];
arr[i]?=?arr[pos];
arr[pos]?=?temp;
}
for?(i=0;?in;?i++)
cout??arr[i]??endl;
}
int?main()
{
int?i[7]?=?{2,?234,?234,?12,?1400,?345,?564};
float?f[7]?=?{2.9,?234.2,?234.5,?12.73,?1400,?345.2,?564.1};
//Bubble(i,?7);
Insert(i,?7);
cout??endl;
//Bubble(f,?7);
Insert(f,?7);
return?0;
}
#includestdio.h
void main()
{
int a[1000],n,m,j,k,temp;
printf("要輸入元素的個(gè)數(shù):");
scanf("%d",n);
printf("請(qǐng)輸入數(shù)字:");
for(m=0;mn;m++)
scanf("%d",a[m]);
for(j=0;jn-1;j++)
for(k=0;kn-j-1;k++)
{
if(a[k]a[k+1])
{
temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
printf("這%d個(gè)數(shù)按由小到大的順序輸出為:",n);
for(m=0;mn;m++)
printf("%d ",a[m]);
}
冒泡排序算法的運(yùn)作如下:
1、比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
2、對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
3、針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
4、持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
這里只需套用函數(shù)模板,將元素的類型設(shè)為模板變量即可,代碼如下:
template?typename?Item
void?sort(Item?*arr)
{
int?i,?j;
Item?temp;
for?(j?=?0;?j??9;?j++)
for?(i?=?0;?i??9?-?j;?i++)
{
if(arr[i]??arr[i?+?1])
{
temp?=?arr[i];
arr[i]?=?arr[i?+?1];
arr[i?+?1]?=?temp;
}
}
}