クイックソート交換

【問題の説明】
クイックソートはバブルソートの改良点で、バブルソートでは隣接する位置でレコードの比較・移動を行う点が改善のポイントです。 1ポジション戻ることができるため、比較と移動の合計数は多くなります。クイックソートでは、レコードが比較され、両端から中央に移動されます。値が大きいレコードは前から後ろに1回移動でき、値が小さいレコードは後から前に1回移動できます。はるかに、それによって比較と移動の総数を減らします。クイックソートアルゴリズムの基本的な考え方は次のとおりです。
軸の値を選択し、ソートするレコードを2つの部分に分割します。左側のレコードは軸の値以下、右側のレコードは軸の値以上で、次にこれらの2つの部分に対して上記を繰り返します。シーケンス全体が注文されるまで処理します。
軸の値の選択に関しては、通常3つの方法があります:
(1)最初のレコード;
(2)ランダム選択;
(3)中央の3つのレコードの値を比較します;
簡単にするために、最初のレコードを軸の値として使用します。
ここで、小規模から大規模への迅速なソートプロセス中に行われたデータ交換の数、つまりデータ移動の数を把握したいと思います。
【入力形式】
入力データの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
2
1

分析:
クイックソートは
バブリングソートの改良版です。バブリングソートでは、レコードの比較と移動は隣接する位置で実行され、レコードは各交換後に1桁しか移動できないため、比較と移動の総数は比較的多くなります。もっと。クイックソートでは、レコードが比較され、両端から中央に移動されます。値が大きいレコードは前から後ろに1回移動でき、値が小さいレコードは後から前に1回移動できます。はるかに、それによって比較と移動の総数を減らします。
クリアバブルソートは、原則のこの質問を見てとることができ、データのバブルソート交換の回数
クエリー軸の値を

int Partition(int L[],int low ,int high)
  {
	L[0]=L[low];//初始 low为轴值 存在L[0]里
	int pivotkey=L[low];//pivotkey为轴值
	while(low < high)
	{
	   while(low<high && L[high]>=pivotkey)
	   //从右向左和轴值进行比较
       --high;//直到找到一个比pivotkey小的数
       if(low<high)
	   {
	       L[low]=L[high];//把这个相对最小的数赋值给low
	       c++;//c=是全局变量 用来记录交换次数的
	   }
	   while(low<high && L[low]<=pivotkey)
	   //从左向右和轴值比较
	   ++low;//直到找到一个比pivotkey大的数
	   if(low<high)
       {
           L[high]=L[low];//把这个相对最大的数赋值给high
           c++;
       }
	}
	L[low]=L[0];把轴值放到最后确定的轴值位置
	return low;返回轴值位置
  }

軸の値の位置を使用した再帰的な並べ替え

void Qsort(int L[],int low,int high)
  {

	if(low>=high)//当low 和 high 相等是 说明已经有序
        return;
	else
	{
	   int pivotloc=Partition(L,low,high);//确定轴值位置
	   Qsort(L,low,pivotloc-1);//左边进行递归
	   Qsort(L,pivotloc+1,high);//右边进行递归

	}
  }
  void QuickSort(int L[],int n)
  {
	Qsort(L,1,n);//默认的low的初始值为1
  }

主な機能

 int main()
  {
     int T;
     cin>>T;
     while(T--)
     {
     c=0;//记录交换次数的全局变量每次初始值为0
	 int n;
	 cin>>n;
	 int data[n+1]={0};
	 for(int i=1;i<=n;i++)
        cin>>data[i];
     QuickSort(data,n);//进行快速排序
     cout<<c<<endl;
//	 for(int i=1;i<=n;i++)
//		 cout<<data[i]<<" ";

     }
     return 0;
  }

以下は少し白いですが、不適切な箇所がある場合は修正してください。

公開された31元の記事 ウォンの賞賛8 ビュー2155

おすすめ

転載: blog.csdn.net/weixin_44034024/article/details/105241499