一、冒泡排列
冒泡排序的原理如下,以8個數由大到小排列為例,進行說明,數據存放在數組a[8]中。
假如8個數分別為4、9、10、3、2、14、11、5。
a[0]<a[1]即4<9,故交換位置,9、4、10、3、2、14、11、5
a[1]<a[2]即4<10,故交換位置,9、10、4、3、2、14、11、5
a[2]>a[3]即4>3,位置不變,繼續比較
a[3]>a[4]即3>2,位置不變,繼續比較
a[4<a[5]即2<14,故交換位置,9、10、4、3、14、2、11、5
a[5]<a[6]即2<11,故交換位置,9、10、4、3、14、11、2、5
a[6]<a[7]即2<5,故交換位置,9、10、4、3、14、11、5、2
由以上比較過程可知,通過7次比較,可以確定最小的數2,並放到末尾。
同理循環這個過程,經過6次比較可以確定3,數列變為:………3、2
經過5次比較可以確定4,數列變為:………4、3、2
經過4次比較可以確定5,數列變為:………5、4、3、2
經過3次比較可以確定9,數列變為:………9、5、4、3、2
經過2次比較可以確定10,數列變為:………10、9、5、4、3、2
經過1次比較可以確定11,數列變為:…………11、10、9、5、4、3、2 同時最大的數也就確定了,數列變為14、11、10、9、5、4、3、2
總結:要比排列出8個數的順序,要循環7次才能做到,每次循環的比較次數分別為7、6、5、4、3、2、1。
下面是將8個數從大排列到小的程序代碼:
1 #include<stdio.h> 2 int main() 3 { 4 int arr[8]; 5 int i,j,temp; 6 for(i=0;i<8;i++) //利用for循環手動輸入8個數,並存放到數組arr[i] 7 { 8 printf("請輸入第%d個數據:\n",i+1); 9 scanf("%d",&arr[i]); 10 } 11 for(i=0;i<7;i++) //i從0~6,要經過7次循環才能排出順序 12 { 13 for(j=0;j<7-i;j++) //7次循環,每次分別比較次數7、6、5、4、3、2、1 14 { 15 if(arr[j]<arr[j+1]) 16 { 17 temp=arr[j]; //交換位置 18 arr[j]=arr[j+1]; 19 arr[j+1]=temp; 20 } 21 } 22 } 23 printf("由大到小排列為:\n"); //利用for循環,將數組輸出 24 for(i=0;i<8;i++) 25 { 26 printf("%d ",arr[i]); 27 } 28 return 0; 29 }
注:若要一組數由小到大排列,將if中的條件語句改變即可,arr[j]>arr[j+1]。
二、選擇排序
選擇排序原理如下,同樣以8個數由大到小排列為例,進行說明,數據存放在數組a[8]中。
假如8個數分別為4、9、10、3、2、14、11、5。第一次以a[0]為定點開始比較。
a[0]<a[1]即4<9,故交換位置:9、4、10、3、2、14、11、5
a[0]<a[2]即9<10,故交換位置:10、4、9、3、2、14、11、5
a[0]>a[3]即10>3,位置不變
a[0]>a[4]即10>2,位置不變
a[0]<a[5]即10<14,故交換位置:14、4、9、3、2、10、11、5
a[0]>a[6]即14>11,位置不變
a[0]>a[7]即14>5,位置不變
由以上比較過程可知,通過7次比較,可以確定最大的數2,並放到首位。
同理循環這個過程,以a[1]為定點,經過6次比較可以確定11,數列變為:14、11………
以a[2]為定點, 經過5次比較可以確定10,數列變為:14、11、10………
以a[3]為定點,經過4次比較可以確定9,數列變為:14、11、10、9………
以a[4]為定點,經過3次比較可以確定5,數列變為:14、11、10、9、5………
以a[5]為定點,經過2次比較可以確定4,數列變為:14、11、10、9、5、4………
以a[6]為定點, 經過1次比較可以確定3,數列變為:14、11、10、9、5、4、3………… 同時最小的數2也就確定了,數列變為14、11、10、9、5、4、3、2
總結:要比排列出8個數的順序,要循環7次才能做到,每次循環的比較次數分別為7、6、5、4、3、2、1
1 #include<stdio.h> 2 int main() 3 { 4 int arr[8]; 5 int i,j,temp; 6 for(i=0;i<8;i++) //利用for循環手動輸入8個數,並存到數組arr[i]中 7 { 8 printf("請輸入第%d個數據:\n",i+1); 9 scanf("%d",&arr[i]); 10 } 11 for(i=0;i<7;i++) //i從0~6,7次循環方能將8個數排列起來 12 { 13 for(j=i;j<8;j++) //7次循環,每次循環比較的次數7、6、5、4、3、2、1 14 { 15 if(arr[i]<arr[j]) 16 { 17 temp=arr[i]; 18 arr[i]=arr[j]; 19 arr[j]=temp; 20 } 21 } 22 } 23 printf("由大到小排列為:\n"); 24 for(i=0;i<8;i++) 25 { 26 printf("%d ",arr[i]); 27 } 28 return 0; 29 }
注:若要一組數由小到大排列,將if中的條件語句改變即可,arr[i]>arr[j]。
三、插入算法
在一組有序(由大到小或由小到大排列)的數列中,插入一個數,保持原有順序。程序代碼如下:
1 #include<stdio.h> 2 int main() 3 { 4 int arr[11]={3,5,6,8,15,17,20,21,45,50,0}; 5 int num; 6 int i; 7 int biaoji=0; //保存找到的下表,默認最小下標 8 printf("請輸入一個數據:\n"); 9 scanf("%d",&num); 10 for(i=0;i<=8;i++) //循環找到要插入的位置下標 11 { 12 if(num>=arr[i]&&num<=arr[i+1]) 13 { 14 biaoji=i+1; 15 break; 16 } 17 if(num>arr[9]) 18 { 19 biaoji=10; 20 break; 21 } 22 } 23 for(i=10;i>biaoji;i--) //把後面的數依次往後移,空出下標位置 24 { 25 arr[i]=arr[i-1]; 26 } 27 arr[biaoji]=num; //把num的值賦給找到的下標處 28 for(i=0;i<11;i++) //顯示結果 29 { 30 printf("%d ",arr[i]); 31 } 32 33 return 0; 34 }