バブルソート(超詳細)

I.はじめに

現在、私たちがよく知っているソートは、バブルソート、選択ソート、挿入ソート、ヒルソート、マージソート、クイックソート、バケットソート、トポロジカルソートなどの種類で人気があります
。1つずつ背が高いようです。 、そして一部の人々はユニークかもしれません。後者の種類は少し混乱します。つまり、具体的な実装原理が何であるかわかりません。知識を脳に実装するために、グループで学習します。

それでは、今回は通常のソートの最初のタイプであるバブルソートを学びましょう。
次回は次のソートを1つずつ記録します。
もう意味がないので、始めましょう

2、バブルソート

誰もがバブルソートに精通していると思います。まだわからない場合は、この記事に従ってゆっくりと学んでください。忍耐力は常に成功します。一度理解したら、何度か読んでいただければ理解できます!

実装の原則: トラバースされた要素がその背後にあるすべての要素と比較されるたびに、比較ルールを満たしている場合、要素の位置はすべての要素のトラバースが終了するまで交換されます。目的は、最小のものに言及することです。毎回トラバースされる要素前
にソートされる配列:4 3 5 1 0 2ソートが完了した
:0 1 2 3 4 5

注:必要に応じて、多くの並べ替え結果があります。例として、配列を小さいものから大きいものに並べ替えています。配列は添え字0から始まります。
フローチャート
の要素の最初の選択を見てみましょう:(位置インデックス:0、値:4)
②「インデックス0」以降のすべての要素のトラバースを開始し、この時点で要素3にトラバースし、インデックス0の4と比較します。
ここに画像の説明を挿入
比較の結果、インデックス0で3が4より小さく、位置がスワップされ、配列の変更は次のようになります
ここに画像の説明を挿入
。②インデックス0の後の要素をトラバース続け、この時点で要素5にトラバースし、インデックス0で3と比較します。ここに画像の説明を挿入
比較の結果、インデックス0で5が3より大きいことがわかりました。このとき、要素の位置は交換されないため、要素の位置は次のようになります
ここに画像の説明を挿入
。③インデックス0以降の要素をトラバースし続けます。このとき、トラバースします。インデックス0の要素1と3に。比較します。
ここに画像の説明を挿入
比較すると、インデックス0で1が3よりも小さいことがわかります。位置を交換します。このとき、要素の位置は次のとおりです
ここに画像の説明を挿入
。④インデックス0の後の要素をトラバースし続けます。このとき、要素0までトラバースし、1と比較します。インデックス0で。
ここに画像の説明を挿入
比較すると、インデックス0で0が1よりも小さいことがわかります。位置を交換します。このとき、要素の位置は次のとおりです
ここに画像の説明を挿入
。⑤インデックス0の後の要素をトラバースし続けます。このとき、要素2にトラバースし、で0と比較します。インデックス0。
ここに画像の説明を挿入
比較の結果、インデックス0で2が0より大きいことがわかりました。この時点では、位置はスワップされていないため、要素の位置は次のようになります。
ここに画像の説明を挿入
したがって、ループの最初のラウンドがここでトラバースされました。最初の位置が見つかりました。配列の(つまり、インデックス0の要素)はすでに配列全体の中で最小のものです。次のループでは、インデックス1の位置をロックし、インデックス1の後ろのすべての要素をトラバースして、の2番目の要素を見つけます。アレイ全体。
ここでは、フローチャートを投稿しません(フローチャートは本当に疲れます)
それでもバブリングソートを完了する方法がわからない場合は、教科書をもっと読んでから、ゆっくりと理解して自分で描くことをお勧めします。これはすぐに習得できます。以下に、バブリングソートコードのJavaバージョンを投稿します。

import java.util.Arrays;

@SuppressWarnings("all")
public class SortClass {
    
    

    // 冒泡排序
    public static void bubbleSort(Comparable[] a){
    
    
        int len = a.length;
        for(int i=0;i<len;++i)
            for(int j=i+1;j<len;++j)
                if(greater(a[i],a[j]))
                    swap(a,i,j);
    }
	// 比较待排序数组里面两个元素的大小
	// 如果 a>b .则返回true,否则返回false
    public static boolean greater(Comparable a , Comparable b){
    
    
        return a.compareTo(b)>0;
    }
	
	// 交换a数组里面索引 i 和索引 j 里面的值
    public static void swap(Comparable[] a,int i,int j){
    
    
        Comparable mid;
        mid = a[i];
        a[i] = a[j];
        a[j] = mid;
    }

    public static void main(String[] args) {
    
    
        // 测试冒泡排序
        // Integer 是 int 的封装类
        Integer[] a = {
    
    2,4,1,5,8,10,0,3,6};
        SortClass.bubbleSort(a);
        for(int c : a){
    
    
            System.out.print(c+" ");
        }
        System.out.println();
    }
}

配列の結果は次のとおり
ここに画像の説明を挿入
です。c言語でのバブルソート

// c语言版的冒泡排序,n 是数组 a 的长度
    void bubble(int& a[],int n){
    
    
        for(int i=0;i<n;++i)
            for(int j=i+1;j<n;++j)
                if(a[j]<a[i])
                    swap(a[i],a[j]);
    }

C ++言語でのバブルソート

// c++语言版的冒泡排序,v 是动态数组
    void bubble(vector<int> &v){
    
    
        int n = v.size();
        for(int i=0;i<n;++i)
            for(int j=i+1;j<n;++j)
                if(v[j]<v[i])
                    swap(v[i],v[j]);
    }

おすすめ

転載: blog.csdn.net/YSJ367635984/article/details/113682160