算法是計算機語言教學中的重要因素,是分析問題的鑰匙、程序設計的思想,離開算法就談不上程序設計。本文闡述了排序算法在復雜問題中的應用、解決思路及相應的C語言程序。
排序算法雖然在C語言教學中經常用到,但是當學生遇到有難度的問題時卻難以解決,無從下手。為了幫助學生提高問題分析能力以及鞏固知識,下面筆者通過兩個復雜問題的分析,讓學生掌握科學的學習方法和思維,寫出正確的程序。
一、排序算法
常用的排序算法有四種,分別是順序比較法、冒泡法、插入法及選擇法,它們各有各的特點,如果沒有特別說明,用順序比較法較為簡單。
二、排序算法的應用
學習程序如果僅僅是局限于排序就沒有了意義,因此常常會涉及有難度和深度的問題。下面筆者通過對兩道考題幫助我們加深對排序的了解。
1.有20個在10—99(含10和99)之間互不相同的整數11,21,22,32,23,43,34,44,56,65,77,57,82,27,95,48,68,64,90,81,按個位數作升序排序,個位數相同時再按十位數作降序排列,將排序結果輸出。
分析:程序應由下面幾個部分組成:定義變量和數組,數組元素的賦值,數組元素的處理——排序,數組元素的輸出。在排序程序段,應將數組元素分解為個位數及十位數,這是本題重要算法之一。
程序清單
#defineN20
main()
{inti,j,x,y,m,n,k;
inta[N]={11,21,22,32,23,43,34,44,56,65,77,57,82,27,95,48,68,64,90,81};
for(i=0;i<=N-2;i++)
for(j=i+1;j<=N-1;j++)
{x=a[i]%10;m=a[i]/10;
y=a[j]%10;m=a[j]/10;
if(x>y){k=a[i];a[i]=a[j];a[j]=k;}
if(x==y){k=a[i];a[i]=a[j];a[j]=k;}}
printf(\"\nthesortednumbersare:\n\");
for(i=0;i<=N-1;i++)
printf(\"%4d\",a[i]);
}
2.下列程序列用數據96,123,78,14,37實現對M×N矩陣a的賦值,要求將給定的數據依次賦給數組b,然后用冒泡法按列自上而下進行升序排列。
例:5×6矩陣的賦值結果 排序結果
96 123 78 14 37 96 14 14 14 14 14
123 78 14 37 96 12337 37 37 37 37
78 14 37 96 123 7878 78 78 78 78
14 37 96 123 78 1496 96 96 96 96
37 96 123 78 14 37123 123 123 123 123
分析:程序中b數組的賦值和排序是關鍵,但問題是如何利用a數組中的數據給b賦值,當a數組中的值使用完畢,再從a數組中的第一個數開始賦值,利用計數器來判斷a數組中元素的個數。因為是二維數組,所以要用到三重循環為數據排序。
程序清單
#define M 5
#define N 6
main()
{inti,j,k,t=0;
inta[5]={96,123,78,14,37};
intx,b[M][N];
for(i=0;i for(j=0;j {b[i][j]=a[t++]; if(t%5==0)t=0; } for(i=0;i {for(j=0;j printf(\"%4d\",b[i][j]); printf(\"\n\");} printf(\"\n\"); for(i=0;i for(j=1;j<=M-1;j++) for(k=0;k<=M-j-1;k++) if(b[k][i]>b[k+1][i]) {x=b[k][i];b[k][i]=b[k+1][i]; b[k+1][i]=x;} for(i=0;i {for(j=0;j printf(\"%4d\",b[i][j]); printf(\"\n\");} } 教師要讓學生舉一反三,擴充問題的廣度與深度,做到融會貫通。這樣,才能提高學生的創新能力,提高學習效率,起到事半功倍的效果。總之,在C語言教學過程中,教師要把重點放在算法上,幫助學生寫出正確的程序。 (責任編輯 羅 艷)