データ構造-スワップソートアニメーションデモ


序文

提示:本人不喜欢用专业术语来记录知识点,所以接下来会用例题+白话文的方式记录:

交換並べ替えの基本的な考え方は、並べ替えるレコードのキーをペアごとに比較することです。2つのレコードの順序が逆になると、逆のレコードがなくなるまで2つのレコードが交換されます。交換ソートの基本的な考え方を適用する主なソート方法は、バブルソートとクイックソートです。


提示:以下是本篇文章正文内容,下面案例可供参考
前の記事からの続き挿入ソート

第二に、交換注文

1.バブルソート

考え:

つまり、ソートされる配列は上から下に格納され、キーワードが小さいレコードは「軽い」と見なされ、キーワードが大きいレコードは「重い」と見なされます(キーワードが大きいレコードは石と見なされます)。 、沈む;小さなキーワードは水蒸気の泡と見なされて浮き上がる;最後に泡が浮き、石が沈み、選別が終了する)

  • これは、バブルソートのプロセス全体を示すインターネットからのより古典的なgifです。
    ここに画像の説明を挿入

基本的な手順:

たとえば、現在ABCDEがあります...これらの数値は、キーワードが多いほど大きく
なります。最初は上から下に乱れ、2つの隣接する比較、つまりペアワイズ比較が比較されます。大きいものが上にあり、小さいものが下にある場合は、大きいものが下になり、小さいものが上になるまで交換します。
ここに画像の説明を挿入

コードセクション

public void bubbleSort() {
    
    
	RecordNode temp;		//辅助结点
	boolean flag = true;    // 是否交换的标记
	for (int i = 1; i< this.curlen && flag; i++){
    
      //有交换时再进行下一趟,最多n-1趟
		flag = false;	//记录未交换
		for(int j = 0; j<this.curlen - i; j++){
    
      	//一次比较、交换
		if (r[j].key.compareTo(r[j + 1].key) > 0){
    
         //逆序时,交换
             temp = r[j];
             r[j] = r[j + 1];
             r[j + 1] = temp;
             flag = true;	//记录交换
           }                    
       } 
    }
}

例:

ソートされる8つのレコードのキーワードシーケンスが{52、39、67、95、70、8、25、52}であると仮定すると、バブルソートプロセスは次の図に示されます。
描画方法1:
ここに画像の説明を挿入
描画方法2:
ここに画像の説明を挿入
手順:
最初のパス:添え字0と1が比較され、1と2が比較され、2と3が比較され、3と4が比較されます。小さいものは上にあり、大きいものは
2回目と3回目の旅行にあります。類推する
と、下の点線はすでに配置されて順序付けられており、それ以上の配置は必要ありません。

パフォーマンス分析

(1)、時間計算量:
O(n 2

(2)、必要な補助スペース:
1つのレコード補助スペースのみO(1)

(3)アルゴリズムの安定性:
安定したソート方法です

2.クイックソート(0番目の要素をピボットとして)

考え:

並べ替えるレコードを1回の並べ替えで2つの独立した部分に分割すると、一方の部分のすべてのレコードのキー値が、もう一方の部分のすべてのレコードのキー値よりも小さくなります。並べ替えでは、並べ替えプロセス全体を再帰的に実行できます。レコードシーケンス全体が順序付けられるようになります。

最初にレコードを見つけて、そのキーワードを「ピボット」として使用します。キーワードがピボットよりも小さいすべてのレコードが左に移動し、逆に、キーワードがピボットよりも大きいすべてのレコードが右に移動します。

  • これは、インターネット上のより古典的な掘り起こしgifで、クイックソートのプロセス全体を示しています。

最初に最初のビットをピット位置として設定します。これは、以下で説明するピボットです。その後、ピット位置は移動しません。キーが左端にある場合、もう一方の端のポインタRが開始します---値が出るまでキーよりも小さいキーが見つかった場合は、ピットを覆い、新しいピットになり、キーよりも大きい値が見つかるまで、左Lをもう一度トラバースして++を開始します。ピットを覆い、新しいピットになりますビット、Rに戻ってやり直し、LRが同じピットに立つまで、最初に設定した数字を最初に置きます、そしてソートが完了します。
ここに画像の説明を挿入

コードセクション

int Partition ( int i, int j) {
    
    
	RecordNode pivot = r[i]; 	// 将第1个记录作为枢轴  
	while (i<j) {
    
    	//从表两端交替向中间扫描
		while(i<j && pivot.key.compareTo(r[j].key) <=0{
    
    
      		j--;      // 从右向左搜索
		if (i<j) {
    
    
		    r[i] = r[j];	//将比枢轴记录关键字值小的记录向前移动到下标为 i 的位置上
		      i++;
		      }
		while (i<j && pivot.key.compareTo(r[i].key)>0){
    
    
        	i++;      // 从左向右搜索
		if (i<j)  {
    
    
			r[j] = r[i];	//将比枢轴记录关键字值大的记录向后移动到下标为 j 的位置上
			   j--;
			   }
		}
	r[i] = pivot;	//枢轴记录到位	
	     return i;	//返回枢轴位置
}	// Partition         

例1:

52 49 80 36 14 58 61 97 23 75
クイックソート
ソリューション:
ここに画像の説明を挿入
手順:
最初に最初の数値52をピボットとして設定し、
r [j] .getKey()をピボットキーワードと後ろから
この質問では、75と52の比較を見てください。75は52よりも大きいため、大きい方が右側にあり
ます。75自体が上にあるため、移動しないでください。右、
ここに画像の説明を挿入
次にjを減らす減算
今回は23が52より小さいので、交換してiの位置に割り当て、左から検索してから、iを加算する必要があり
ます。r[i]を比較してください。ピボットキーワードでキーを押し、r[i]を要求します。key≤pivotkey。
ここに画像の説明を挿入
i + +は49になり、49は52より小さく、49は左側にあり、スワップする必要はありません。次に、
ここに画像の説明を挿入
i + +を80の位置に加算し、80は52より大きく、jのこの位置に割り当てます。
ここに画像の説明を挿入
次に、jを減らし、97の位置に移動します。97は52より大きいので、移動する必要はありません。
ここに画像の説明を挿入
次に、jを減らして減らし、61の位置に移動します。61は52より大きいので、移動する必要はありません。
ここに画像の説明を挿入
次に、減少します。再びjを減らして58の位置にすると、58は52よりも大きいので、交換する必要はありません。次に、ピボット52よりも小さいj ---がに到達する
ここに画像の説明を挿入
まで、jが再び減算されます。
14、14は52よりも小さいです。今回は、14をiの位置に
ここに画像の説明を挿入
入れ替えて、左に入れ替える必要があります。iを
36の位置に加算します。36は52よりも小さいので、交換する必要はありません。
ここに画像の説明を挿入
次に、iを加算して、iとjが同じ数を指していることを確認します。これは等しいです。iとjが等しい場合
、並べ替え全体で52の位置が検出されます。左側の値
がわかります。 52のは52よりも小さいです。52の右側の値はすべて52よりも大きいです
ここに画像の説明を挿入

例2:

キーワードのシーケンス
{ 39、2、12、40、34、33、50、1、55、60}
のクイックソートの最初のパスの結果を書き出します

ここに画像の説明を挿入
手順:
最初にピボットを実行します:39(最初の)、次に、2つの変数i、j、iを左側に、jを右側に定義
ここに画像の説明を挿入
し、後ろから前に向かって、
60が39より大きい、気にしない、
55が39より大きい、気にしない、を見つけます。
次に位置1に移動します。1は39より大きいです。小さい
1はここで左側のiの位置に移動し、左側の
ここに画像の説明を挿入
i + +に移動し、39より大きいものを見つけて、右側に交換します
。2は小さいです。 39、移動する必要はありません
12は39より小さい、
40の位置まで移動する必要はありません、39より大きい場合は、
40をjの位置に交換します
ここに画像の説明を挿入
これはjの位置であり、次にjに移動します--- 39より小さく39より大きい50
を見つけ、移動しないで、33をポイントします。39より小さい場合は、 33をiの位置に入れ替えて、もう一度iに移動します。エッジ、i ++が39より大きいを見つけ、移動します。 jの位置まで、34は39よりも小さいので動かないでください。33を指すと、iとjが等しいので、この位置がピボットの位置になります。最後に、左側の数字がよりも小さいことがわかります。 39.;右の桁が39より大きい


ここに画像の説明を挿入





ここに画像の説明を挿入

パフォーマンス分析

(1)、時間計算量:
O(nlog 2 n)

(2)、必要な補助スペース:
O(log 2 n)

(3)アルゴリズムの安定性:
不安定なソート方法です

要約する

バブルソート

バブルソートは実はとてもシンプルです。2つずつ比較すると、大きい数字が下/後ろになり、小さい数字が上/前になります。

クイックソート

最初にピボットの最初の数を取り、次に2つの変数iとjを取ります。iは0、jは配列の長さから1
を引いたものです。次に、jから始めて前方に検索し、ピボットよりも小さい数を見つけて交換します。左にi位置、
次にi + +、右を見て、ピボットよりも大きい数が見つかるまで
、右から右の位置にあるj位置にスワップします。j---、ピボットよりも小さい数を見つけます。 、今すぐ左に交換します。iの位置、
今度は左に、i + +、次に右に、ピボットよりも大きい数が見つかるまで、右のjの位置に
iまで交換します。とjが等しい場合、等しい位置はピボットの位置です。
最後に、左側のシーケンスはピボットよりも小さく、右側のシーケンスはピボットよりも大きくなります。

おすすめ

転載: blog.csdn.net/rej177/article/details/124329753