JAVAインターンシップ求人検索-バブルの並べ替え、クイック並べ替え

1.バブルソート

バブルソートは基本的なソートアルゴリズムです。主な考え方は、小さいものから大きいものに並べ替える場合は、隣接する要素を比較し、左側の要素が右側より大きい場合は位置を交換します。

たとえば、配列は9-18-6-5-12です。これらの5つの要素を小さいものから大きいものに並べ替えます。アイデアは次のとおりです。

(1)No.1とNo.2を比較、交換なし、No.2とNo.3を比較、9-6-18-5-12を交換、No.3とNo.4を比較、9-6-5を交換-18-12; 4位と5位を比較し、9-6-5-12-18を交換します。現時点では、最大の18はすでに最後の場所にあります

(2)1位と2位の比較、6-9-5-12-18の交換、2位と3位の比較、6-5-9-12-18の交換、3位と4位の比較ビット、スワッピングなし。このとき、2番目に大きい12は2番目に大きい

(3)1位と2位を比較し、5-6-9-12-18を交換します。2位と3位を比較し、交換しません。3番目に大きい9が戻ってきました

(4)交換せずに1位と2位を比較します。並べ替え

概要:n個の数値を並べ替える場合、最後を並べ替えるにはn-1回のトリップが必要です。各トリップは数値を戻すことができるため、各トリップは後方比較を開始する最初のビットですが、比較する必要はありません。一つ。

package com.note;

import java.util.Scanner;

public class 冒泡排序 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//表示有n个数
        int[] arr = new int[n + 1];

        //将n个数存储到arr数组中
        for (int i=1;i<=n;i++){
            arr[i] = sc.nextInt();
        }

        //冒泡排序
        for (int i=1;i<=n-1;i++){//需要进行n-1趟排序
            for (int j=1;j<=n-i;j++){//比较到n-i即可,因为每次都会排好一位
                if (arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        
        //输出排序后的数组
        for (int i=1; i<=n; i++)
            System.out.print(arr[i]+" ");
        
    }
}

コードは上記のとおりで、メモは非常に明確です。次に、

5
9 18 6 5 12

結果は以下の通りです

5 6 9 12 18 

第二に、クイックソート

クイックソートアルゴリズムは頻繁に使用されるアルゴリズムですが、再帰的な分割統治のアイデアが含まれているため、バブルソートよりもはるかに理解が困難です。これら2つのアイデアは、私がクラスの生徒であっても、理解するのは非常に難しいと思います簡単ではないので、ここではこれら2つのアイデアについては説明しませんが、並べ替えの高速化の仕組みを直接説明します。

たとえば、配列は9-18-6-5-12-8-3-7です。これらの8つの要素を小さいものから大きいものに並べ替えます。アイデアは次のとおりです。

(1)最初に参照番号を設定します。たとえば、最初の番号、たとえば9です。したがって、9は参照番号です

(2)左= 1に設定して最初の数値9を指し、右= 8に設定して最後の数値7を指します。

(3)参照番号より小さい数が見つかるまで、最初に右に左に移動します。実際、右= 8の場合、要素は9未満であり、左= 2の場合、9より大きい数が見つかるまで左に右に移動します18の要素は9より大きい。arr [左]とarr [右]を交換します。つまり、9-7-6-5-12-8-3-18です。

(4)右は左に続き、要素は右= 7の場合は9未満3、左は右に続き、要素は左= 5の場合9より大きい12、9-7-6-5-3-8-12-18と交換。

(5)右が左に続く場合、要素は右= 6の場合9未満8です。左=右に続く場合、左= 6の場合、このとき左と右が出会うとき、標準番号を返す、つまり9と8を交換する必要があります8-7-6-5-3-9-12-18を取得します。このとき、9の左側が9未満で、9の右側が9より大きいことがわかります。

(6)同じように、9の左側の数字をすばやく並べ替え、右側をすばやく並べ替えます。

package com.note;

import java.util.Scanner;

public class 快速排序 {
    private static int[] arr;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//表示有n个数
        arr = new int[n + 1];

        //将n个数存储到arr数组中
        for (int i=1;i<=n;i++){
            arr[i] = sc.nextInt();
        }

        //调用快速排序函数
        f(1,n);


        //输出排序后的数组
        for (int i=1; i<=n; i++)
            System.out.print(arr[i]+" ");
    }

    private static void f(int left, int right) {
        if (left > right)
            return;
        //设置一个基准数
        int temp = arr[left];
        //设置左右2大使者
        int i = left;
        int j = right;


        while (i != j){//当i和j没有相遇

            //j向左寻找一个小于temp的数
            while (arr[j]>=temp && i<j)
                j--;
            //i向右寻找一个大于temp的数
            while (arr[i]<=temp && i<j)
                i++;
            //找到之后交换
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }


        //i和j相遇,就将基准数归位
        arr[left] = arr[i];
        arr[i] = temp;

        f(left, i-1);//继续递归处理左边的数组
        f(i+1, right);//继续递归处理右边的数组
    }
}

入力

8
9 18 6 5 12 8 3 7

出力後

3 5 6 7 8 9 12 18 

元の記事を111個公開 60のような 70,000 +ビュー

おすすめ

転載: blog.csdn.net/Haidaiya/article/details/105229285