C語言:排列陣列的三種方法:冒泡法、選擇法、插入法
題目來源:大工慕課 連結
作者:Caleb Sung
注意事項
- 排序過程中從大到小或從小到大排序方式可由迴圈體中if中兩個數的大小關係來指定,大家可以實際實踐一下看看效果。
- 例項的程式碼都是10個數的排序,有其他數字長度的排序需求的話改一下程式碼裡的數字就行啦。
冒泡法
演算法分析
如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元素位置),最大值沉底為升序,最小值沉底為降序。
演算法特點
相鄰元素兩兩比較,每趟將最值沉底即可確定一個數在結果的位置,確定元素位置的順序是從後往前,其餘元素可能作相對位置的調整。可以進行升序或降序排序。
參考程式碼
# include <stdio.h>
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
/*輸入源資料*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);
/*排序*/
for(j=0;j<9;j++) /*外迴圈控制排序趟數,n個數排n-1趟*/
for(i=0;i<9-j;i++) /*內迴圈每趟比較的次數,第j趟比較n-j次*/
if(a[i]>a[i+1]) /*相鄰元素比較,逆序則交換*/
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
/*輸出排序結果*/
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
選擇法
演算法分析
每趟選出一個最值和無序序列的第一個數交換,n個數共選n-1趟。第i趟假設i為最值下標,然後將最值和i+1至最後一個數比較,找出最值的下標,若最值下標不為初設值,則將最值元素和下標為i的元素交換。
演算法特點
每趟是選出一個最值確定其在結果序列中的位置,確定元素的位置是從前往後,而每趟最多進行一次交換,其餘元素的相對位置不變。可進行降序排序或升序排序。
參考程式碼
# include <stdio.h>
main()
{
int a[10],i,j,k,t,n=10;
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++) /*外迴圈控制趟數,n個數選n-1趟*/
{
k=i; /*假設當前趟的第一個數為最值,記在k中 */
for(j=i+1;j<n;j++) /*從下一個數到最後一個數之間找最值*/
if(a[k]<a[j]) /*若其後有比最值更大的*/
k=j; /*則將其下標記在k中*/
if(k!=i) /*若k不為最初的i值,說明在其後找到比其更大的數*/
{ t=a[k]; a[k]=a[i]; a[i]=t; } /*則交換最值和當前序列的第一個數*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
插入法
演算法分析
將序列分為有序序列和無序列,依次從無序序列中取出元素值插入到有序序列的合適位置。初始是有序序列中只有第一個數,其餘n-1個陣列成無序序列,則n個數需進n-1次插入。尋找在有序序列中插入位置可以從有序序列的最後一個數往前找,在未找到插入點之前可以同時向後移動元素,為插入元素準備空間。
演算法特點
每趟從無序序列中取出第一個數插入到有序序列的合適位置,元素的最終位置在最後一趟插入後才能確定位置。也可是先用迴圈查詢插入位置(可從前往後或從後往前),再將插入位置之後的元素(有序列中)逐個後移一個位置,最後完成插入。該演算法的特點是在尋找插入位置的同時完成元素的移動。因為元素的移動必須從後往前,則可將兩個操作結合在一起完成,提高演算法效率。仍可進行升序或降序排序。
參考程式碼
# include <stdio.h>
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++) /*外迴圈控制趟數,n個數從第2個數開始到最後共進行n-1次插入*/
{
t=a[i]; /*將待插入數暫存於變數t中*/
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下標0 ~ i-1)中尋找插入位置*/
a[j+1]=a[j]; /*若未找到插入位置,則當前元素後移一個位置*/
a[j+1]=t; /*找到插入位置,完成插入*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
相關文章
- 指標對陣列排序選擇法和冒泡法指標陣列排序
- 冒泡,選擇排序法(C#)排序C#
- C語言排序 冒泡 選擇 快排C語言排序
- 選擇法和冒泡法排序介面排序
- (三)陣列的定義、折半查詢、排序(選擇和冒泡)陣列排序
- 排序法:選擇、冒泡、插入和快排排序
- c語言中陣列的三種型別C語言陣列型別
- c語言的陣列C語言陣列
- C語言陣列C語言陣列
- java語言複製陣列的四種方法Java陣列
- 新學一種c語言寫法C語言
- C語言(字元陣列)C語言字元陣列
- c語言字元陣列C語言字元陣列
- 陣列基本操作及冒泡演算法、直接選擇排序陣列演算法排序
- C語言陣列實現三子棋C語言陣列
- [ASM C/C++] C語言陣列ASMC++C語言陣列
- 常見的三種排序演算法(選擇,冒泡,計數)排序演算法
- C語言-選擇結構C語言
- scala語法 -多維陣列陣列
- ES6語法學習筆記之陣列的各種迴圈方法筆記陣列
- C語言_指標和陣列的幾種訪問形式C語言指標陣列
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- 最簡單易懂的三種排序演算法:冒泡、選擇、插入排序演算法
- 陣列分組chunk的一種寫法陣列
- C語言 指標與陣列C語言指標陣列
- c語言陣列、sizeof()及strlen()C語言陣列
- C語言基礎-1、陣列C語言陣列
- C語言求其字元陣列的長度C語言字元陣列
- 陣列選擇排序陣列排序
- 七種常見的陣列排序演算法整理(C語言版本)陣列排序演算法C語言
- c語言中三維陣列C語言陣列
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- JavaSE基礎語法3-陣列Java陣列
- Java 語法介紹(四):陣列(轉)Java陣列
- C語言陣列求學生成績C語言陣列
- c語言-運算子,陣列,指標C語言陣列指標
- 【JS】JS陣列新增元素的三種方法JS陣列
- JS陣列隨機排序的三種方法JS陣列隨機排序