我的中间数扫描哪里有问题

7-2 冒泡法排序(20 分)

将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。

输入格式:

输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。

输出格式:

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

输入样例:

6 2
2 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;

}


名不见经传的小菜鸟
浏览 1526回答 1
1回答

Yexiaomo

在你原有的代码上我做了如下修改需要修改代码都被我注释了,自己对照看吧#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的平台上提交)还需要一些小的改动
打开App,查看更多内容
随时随地看视频慕课网APP