Javaバブルソートアルゴリズムの最適化について

最も基本的なバブルソートアルゴリズム

// Java冒泡排序算法(最基础版本)
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length; j++) {
    
    
			for (int i = 0; i < a.length-1; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

アルゴリズムの出力は次のとおりです。
ここに画像の説明を挿入

これは、ほとんどの人が書いた最初のバブルソートアルゴリズムです(最適化アルゴリズムの品質を以下でより直感的に示すために、コード内の内部ループと外部ループの数を直接記録します)、Javaを学ぶすべての将来のプログラマー、あなたはすべてこの最も基本的なアルゴリズムを体験し、このアルゴリズムの最適化を検討したことがありますか?
以下に要約するアルゴリズムの2つの最適化:

最適化アルゴリズム(1)。毎回アレイをトラバースする回数を減らすことについて

// 第一次优化
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length-1; j++) {
    
    
			for (int i = 0; i < a.length-1-j; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

最初の最適化後の出力は次のとおりです
ここに画像の説明を挿入
。内部ループの数が半分に減少します!!!
各内部ループを通じて、最大値が取得されて配列の最後に配置され、2番目のトラバーサルはこの数を直接スキップします。最初の最適化を手に入れよう!

早期割り込みトラバーサルには開閉原理を使用します(最終バージョン)

// 利用闭合原则对算法的二次优化
import java.util.Arrays;

//研究冒泡排序
public class BubbleSort {
    
    
	public static void main(String[] args) {
    
    
		//arrays自带的排序方法
		int[] a = {
    
    3,1,4,5,6};
		/*Arrays.sort(a);
		System.out.println(Arrays.toString(a));*/
		int inner = 0;
		int outner = 0;
		
		for (int j = 0; j < a.length-1; j++) {
    
    
			boolean flag = true;
			for (int i = 0; i < a.length-1-j; i++) {
    
    
				if (a[i]>a[i+1]) {
    
    
					flag = false;
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
				System.out.println("当前内循环的次数:" + (++inner));
			}
			
			System.out.println("当前外循环的次数为:" + (++outner)+"当前数组的输出为:"+Arrays.toString(a));
			if (flag) {
    
    
				System.out.println("提前就结束啦!");
				break;
			}
		}
		
		System.out.println(Arrays.toString(a));
		
	}
}

アルゴリズムの出力は次のとおりです。
ここに画像の説明を挿入
トラバーサルの数が再び削減されます!!!
外側のループでブール型の変数フラグを定義することにより、内側のループのifステートメントが実行されない場合、要素がないことを意味します。ループ内、つまりこの時点での配列に移動しました。並べ替えは完了しているため、再度並べ替える必要はありません。

結論

Javaを最初に学んだときは、速く学ぶ必要はありませんでした。各知識ポイントを学んだ後は、さらに深く掘り下げる必要があります。

おすすめ

転載: blog.csdn.net/xiaole060901/article/details/107574678