冒泡排序

发布时间 2023-10-31 23:57:33作者: 刘倩_网安2211


PS:答题思路为本人对此题解法的思考。

题目

本题目要求读入N个整数,采用冒泡排序(上升法,即每轮得到一个最小值)进行排序,输出前3轮排序后的结果。

输入格式:
输入不超过100的正整数N和N个整数(空格分隔)。

输出格式:
输出三行,第一行为第一轮排序结果,第二行为第二轮排序结果,第三行为第三轮排序结果。数据间用一个空格分隔。

为简便起见,最后一个元素后也有一个空格。

输入样例:

5
2 5 4 1 3

输出样例:

1 2 5 4 3 
1 2 3 5 4 
1 2 3 4 5 

图(非本题目要求,而是每轮在数组的最后得到一个最大值)

第一轮图

从a[0]和a[1]开始比较,没有逆序,不交换。

a[1]和a[2]比较

逆序,交换

a[2]和a[3]比较

逆序,交换

a[3]和a[4]比较

逆序,交换

第一轮结束,得到结果为最大值排到数组最后位置

答题思路

参考上面流程,由“采用冒泡排序(上升法,即每轮得到一个最小值)进行排序”可知

  1. 数组从后往前到第一个位置比较相邻的两个元素;
  2. 若逆序(即前者大于后者),则将两元素交换。即每次比较完都会得到前者小与后者的结果。
  3. 第一轮排序结束后,数组中最小的元素已被交换到首位。
  4. 再从数组最后往前到第二个位置重复1-3的操作,直到排到倒数第二个位置。此时排除了已在前面排好序的最小元素,得到第二小元素
  5. 以此类推,最后数组的值从小到大排列。

代码

#include<stdio.h>
int main(){
    int n;
    int a[100];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<3;i++)
    {
        for(int j=n-1;j>i;j--)
        {
            if(a[j-1]>a[j])
            {
                int temp=a[j-1];
                a[j-1]=a[j];
                a[j]=temp;
            }
        }
        for(int k=0;k<n;k++)
        {
            printf("%d ",a[k]);
        }
        printf("\n");
    }
        
    return 0;
}

输入:

输出: