摘要:在c語(yǔ)言編程中,起泡排序和選擇排序是兩種常見(jiàn)的排序編程,教師應(yīng)認(rèn)識(shí)到這兩種排序編程的重要性、編程過(guò)程、特征和應(yīng)用。
關(guān)鍵詞:起泡法;選擇法;排序
一、重要性分析
在c語(yǔ)言的教學(xué)中,起泡排序和選擇排序是教學(xué)重點(diǎn),在c語(yǔ)言編程考核中,對(duì)這兩種排序的考核,也往往用來(lái)作為測(cè)量學(xué)習(xí)者水平高低的標(biāo)準(zhǔn)。
二、起泡法
用起泡法對(duì)10個(gè)數(shù)排序(由小到大)
1.算法分析
將相鄰兩個(gè)數(shù)比較,將小的調(diào)到前頭,大的調(diào)到后頭。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此類(lèi)推,直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最后。在第二趟:仍從第一對(duì)數(shù)開(kāi)始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)(其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過(guò)程,直至最終完成排序。
若有6個(gè)數(shù):26 25 17 58 49 13
第一趟排序后結(jié)果:25 17 26 49 13 58
第二趟排序后結(jié)果:17 25 26 13 49 58
第三趟排序后結(jié)果:17 25 13 26 49 58
第四趟排序后結(jié)果:17 13 25 26 49 58
第五趟排序后結(jié)果:13 17 25 26 49 58
2.編程分析
#include
void main( )
{int a[10];
int i,j,t;
printf(“input 10 numbers: \n”);
for (i=0;i<10;i++)
scanf(“%d”,a[i]);
printf(“\n”);
for (j=0;j<9;j++)
for (i=0;i<9-j;i++)
if (a[i]>a[i+1])
{ t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf(“the sorted numbers: \n”);
for (i=0;i<10;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
雙重循環(huán)部分是本程序的重點(diǎn),要理清變量i,j,t的關(guān)系,其中i用來(lái)控制內(nèi)循環(huán)的次數(shù),并通過(guò)外循環(huán)變量j的增加,決定每趟循環(huán)的次數(shù)及最后一次交換后數(shù)組內(nèi)的最大元素。
三、選擇法
用選擇法對(duì)10個(gè)數(shù)排序(由小到大):
1.算法分析
n個(gè)記錄的文件的選擇排序,第1趟通過(guò)n-1次比較,從n個(gè)數(shù)中選擇出一個(gè)最小結(jié)果。
第i趟簡(jiǎn)單選擇排序是指通過(guò)n-i次關(guān)鍵字的比較,從n-i+1個(gè)記錄中選出關(guān)鍵字最小的紀(jì)錄,并和第i個(gè)記錄進(jìn)行交換。共需進(jìn)行i-1趟比較,直到所有記錄排序完成為止。
若有6個(gè)數(shù):26 25 17 58 49 13
第一趟排序后結(jié)果:[13] 26 25 58 49 17
第二趟排序后結(jié)果:[13] [17] 26 58 49 25
第三趟排序后結(jié)果:[13] [17] [25] 58 49 26
第四趟排序后結(jié)果:[13] [17] [25] [26] 58 49
第五趟排序后結(jié)果:[13] [17] [25] [26] [49] [58]
2.編程分析
#include
void main( )
{int a[10];
int i,j,t;
printf(“input 10 numbers: \n”);
for (i=0;i<10;i++)
scanf(“%d”,a[i]);
printf(“\n”);
for (j=0;j<9;j++)
for (i=j+1;i<10;i++)
I if (a[j]>a[i])
{t=a[i];
a[i]=a[j];
a[j]=t;
}
printf(“the sorted numbers: \n”);
for (i=0;i<10;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
雙重循環(huán)部分是本程序的重點(diǎn),要理清變量i,j,t的關(guān)系,其中i用來(lái)控制內(nèi)循環(huán)的次數(shù),通過(guò)外循環(huán)變量j的增加,決定每趟循環(huán)的次數(shù),用j作為每趟選擇后最小值的存放。
四、起泡法和選擇法在實(shí)際問(wèn)題中的應(yīng)用
1.利用兩種排序法可以解決排序問(wèn)題
起泡法和選擇法都可以對(duì)數(shù)據(jù)進(jìn)行排序,兩種方法都應(yīng)熟練掌握。
2.利用兩種排序方法的思想,可以解決最大值和最小值問(wèn)題。來(lái)看兩個(gè)編程題:
(1)從鍵盤(pán)上任意輸入10個(gè)不相同的整數(shù),請(qǐng)自動(dòng)輸出最小值。
(2)從鍵盤(pán)上任意輸入10個(gè)不相同的整數(shù),請(qǐng)自動(dòng)輸出最大值。
問(wèn)題1求最小值,我們只需使用選擇法,經(jīng)過(guò)一趟比較就可以求出最小結(jié)果;問(wèn)題2求最大值,使用上面起泡程序,略作修改便可完成編程。
參考文獻(xiàn):
[1]譚浩強(qiáng).c程序設(shè)計(jì)[M].清華大學(xué)出版社,2005.
[2]林東,陳林.編程語(yǔ)言基礎(chǔ)c語(yǔ)言[M].高等教育出版社,2007(12).
(作者單位 江蘇省邳州市車(chē)輻中等專(zhuān)業(yè)學(xué)校)