7-2?冒泡法排序(20?分)將N個整數按從小到大排序的冒泡排序法是這樣工作的:從頭到尾比較相鄰兩個元素,如果前面的元素大于其緊隨的后面元素,則交換它們。通過一遍掃描,則最后一個元素必定是最大的元素。然后用同樣的方法對前N?1個元素進行第二遍掃描。依此類推,最后只需處理兩個元素,就完成了對N個數的排序。本題要求對任意給定的K(<N),輸出掃描完第K遍后的中間結果數列。輸入格式:輸入在第1行中給出N和K(1≤K<N≤100),在第2行中給出N個待排序的整數,數字間以空格分隔。輸出格式:在一行中輸出冒泡排序法掃描完第K遍后的中間結果數列,數字間以空格分隔,但末尾不得有多余空格。輸入樣例:6 22 3 5 1 6 4輸出樣例:2 1 3 4 5 6#include<stdio.h>int main(){ int i,j,N,K; ? ? ? ? ? ? ? ? ? ? int arr[100]; scanf("%d",&N,&K); for(i=0;i<N;i++) ? ? ? ? ? ?// 這是所求N-1遍的掃描如果相求K遍就將N換K { scanf("%d",&arr[i]); } for(i=N-2;i>=0;i--) { for(j=0;j<=i;j++) ? ? ? ? // 相鄰兩個數的比較 { if(arr[j]>arr[j+1]) ? // 具體操作 { int temp; temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } for(i=K;i<N-K-2;i--) ? ? ? ?// 對中間數的掃描 { for(j=0;j<=i;j++) { if(arr[j+1]>arr[j+2]) { ? int swap; ? swap=arr[j+1]; ? arr[j+1]=arr[j+2]; ? arr[j+2]=swap; } } } for(i=0;i<N;i++) { printf("%d\t",arr[i]); } return 0;}
1 回答
已采納

Yexiaomo
TA貢獻152條經驗 獲得超157個贊
在你原有的代碼上我做了如下修改
需要修改代碼都被我注釋了,自己對照看吧
#include<stdio.h> int?main() { ????int?i,j,N,K;???????????????????? ????int?arr[100]; ???? //????scanf("%d",&N,&K);? ????scanf("%d%d",&N,&K); ???? ????for(i=0;i<N;i++) ????{ ????????scanf("%d",&arr[i]); ????} ???? //????for(i=N-2;i>=0;i--) for(i=N-2;i>=0&&K>0;i--,K--)?//也可以-->for(i=N-2;i>=0&&K>0;i--,K--) ????{ ????????for(j=0;j<=i;j++) ????????{ ????????????if(arr[j]>arr[j+1]) ????????????{ ????????????????int?temp; ????????????????temp=arr[j]; ????????????????arr[j]=arr[j+1]; ????????????????arr[j+1]=temp; ????????????} ????????} ????} //?刪除? //????for(i=K;i<N-K-2;i--) //????{ //????????for(j=0;j<=i;j++) //????????{ //????????????if(arr[j+1]>arr[j+2]) //????????????{ //????????????????int?swap; //????????????????swap=arr[j+1]; //????????????????arr[j+1]=arr[j+2]; //????????????????arr[j+2]=swap; //????????????} //????????} //????} ????for(i=0;i<N;i++) ????{ ????????//printf("%d\t",arr[i]); ????????printf("%d?",arr[i]); ????} ????return?0; }
最后的打印結果,如果是要測試的話(在ACM的平臺上提交)還需要一些小的改動
- 1 回答
- 0 關注
- 1592 瀏覽
添加回答
舉報
0/150
提交
取消