冒泡排序中数据的交换次数

【问题描述】
冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
现在希望算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
【输入形式】
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100
【输出形式】
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数。
【样例输入】
3
5 1 2 3 4 5
4 5 3 7 1
2 2 1

【样例输出】
0
4
分析:
1.冒泡排序的原理: 假设有n 个数据需要排序 我们需要利用循环 这里以从小到大排列为例
①在这n个数据中找到最大的数 (方法是相邻的两个数比较 如果前一个数比后面的大 就把这两个数交换 )用这样的方法就把最大的放到最后位置了 然后n-1
②通过这种方法 每一次循环都能找到一个最大的值放到后面 因为最后一次循环的时候已经成了有序序列 所以外层循环n-1次即可.
2.对于本题 只需要在交换数据的时候用一个计数器计数 最后打印输出就可以

#include <iostream>

using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)//T组数据
    {
        int N,t,sum=0;//计数器
        cin>>N;
        int data[N];
        for(int i=0;i<N;i++)
        {
            cin>>data[i];//录入数据
        }
        for(int i=0;i<N-1;i++)//外层循环 循环n-1次
        {
            for(int j=0;j+i<N-1;j++)//内层循环 找到最大的
            {
                if(data[j]>data[j+1])
                {
                    t=data[j];
                    data[j]=data[j+1];
                    data[j+1]=t;
                    sum++;//每次交换计数器加一


                }
            }
        }
//        for(int i=0;i<N;i++)
//            cout<<data[i]<<" ";
//        cout<<endl;
        cout<<sum<<endl;//最后输出计数器的值
    }
}

在下是一名小白 如果有不恰当的地方 欢迎指正

发布了31 篇原创文章 · 获赞 8 · 访问量 2155

猜你喜欢

转载自blog.csdn.net/weixin_44034024/article/details/105240378