【問題の説明】
バブルソーティングアルゴリズムの原理は次のとおりです:
隣接する要素を比較します。1つ目が2つ目より大きい場合は、両方を交換します。
最初の最初のペアから最後の最後のペアまで、隣接する要素の各ペアについて同じことを行います。この時点で、最後の要素が最大数になるはずです。
最後の要素を除くすべての要素に対して上記の手順を繰り返します。
比較する数値のペアがなくなるまで、上記の手順を繰り返して、要素を少しずつ減らしていきます。
ここで、並べ替えプロセス中に小規模から大規模に行われたデータ交換の数を調べたいと思います。
【入力形式】
入力データの1行目は正の整数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はデータの最大数を見つける(で隣接する2つの数値を比較します。前の数値が後者の数値より大きい場合は、2つの数値を交換します。)この方法を使用して、最大の数値を最後の位置に配置し、次に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;//最后输出计数器的值
}
}
以下は少し白いですが、不適切な箇所がある場合は修正してください。