[Javaの→バブルソート、バイナリ検索]怠惰な黒いノート08(白、向いて保管してください)

免責事項:ご質問がある場合は、[感情] Shangxue唐の照合を見て、このノートでは、著者はソースを示し連絡してください!

6.4バブルソートアルゴリズムの基礎

バブルソート非常に一般的に記述された、一般的なソートアルゴリズムです。
彼らは間違った順序交換に入れた場合のアルゴリズムを繰り返し、ソートする列数を訪れた最初の2つの要素を比較し、より大きな要素がトップにゆっくりと「バブル」に交換されていたであろう。

ステップ:
第一要素は第二、スイッチ配列よりも大きい場合、第1の比較は、2つの隣接する要素を起動します。
図2は、最初から第一の対の端部に、隣接する素子の各ペアに対して、同じ作業を行います。最後の要素は、最大の数です。
3、最後の1を除いて、すべての要素について、上記の手順を繰り返します。
4は、あなたが比較する必要がある要素の終わりなしに、ソートが完了しています。

【下に】
バブルソート概略図
また、以下の図の動的接続を観察し、比較的明確な、容易に理解[ https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvODQ5NTg5LzIwMTcxMC84NDk1ODktMjAxNzEwMTUyMjMyMzg0NDktMjE0NjE2OTE5Ny5naWY ]

免責事項:この映画はで再現された
著者:YYYスス[ https://blog.csdn.net/qq_41679818/article/details/90296399 ]この記事!

[テスト]バブルソート例

		//冒泡排序
		
		int[] b = {2,1,3,4,8,0,9,7,5};
		
		int temp = 0;
		
		for(int j = 0;j<b.length;j++) {
			boolean flag = true;
			for(int i = 0;i<b.length-1-j;i++) {
				/*
				 * 注意:i<b.length会出现数组溢出异常,
				 * 因为当比较到最后一位时是if(b[4]>b[5]),
				 * 但数组定义没有b[5].所以会发生错误!
				 * 
				 */
				if(b[i]>b[i+1]) {
					temp = b[i+1];
					b[i+1] = b[i];
					b[i] = temp;
				}
				System.out.println(Arrays.toString(b));
				//当只有一个循环是得到最大元素,还需要嵌套一个循环,
				//把前面的元素再重复比较

[結果]
01の結果02の結果03の結果

6.4.1バブルソートアルゴリズムの最適化

最初に、全体のシーケンスが空のサイクルの注文番号として、最大の要素は下にプッシュされますたびに乱れているが、すでに再循環排気が良い順序付けられたシーケンスを持って考慮されていません。 (コードの実行の結果として観察されます)。発生していない場合したがって、アレイは、この時点で、その後の回数を比較する必要を注文されていないことを示す、各パスは、配列要素を交換発生したか否かを判断します。この時点で比較を中止することができます。

最適化アルゴリズムの例としては、[テスト]バブルソート

//冒泡排序(优化算法)
		
		int[] b = {2,1,3,4,8,0,9,7,5};
		
		int temp = 0;
		
		for(int j = 0;j<b.length;j++) {
			boolean flag = true;
			for(int i = 0;i<b.length-1-j;i++) {
				/*
				 * 注意:i<b.length会出现数组溢出异常,
				 * 因为当比较到最后一位时是if(b[4]>b[5]),
				 * 但数组定义没有b[5].所以会发生错误!
				 * 
				 */
				
				//比较大小,换顺序
				if(b[i]>b[i+1]) {
					temp = b[i+1];
					b[i+1] = b[i];
					b[i] = temp;
					
					flag = false;
				}
				System.out.println(Arrays.toString(b));
				//当只有一个循环是得到最大元素,还需要嵌套一个循环,
				//把前面的元素再重复比较
				
			}
			if(flag) {
				System.out.println("结束!!");
				break;
			}
			System.out.println("------------");
			
		}

[結果]
01の結果02の結果03の結果

6.5二分探索(バイナリサーチ)

また、バイナリサーチバイナリ検索として知られています。配列要素(キー)の中間要素を取得する必要が与えられ、小から大への配列の要素は、一種のアレイに記憶される、と等しい場合、検索は成功:検索が前提条件であります!

キーより小さい場合、二分探索は、アレイの前半で行われ、
キーよりも大きい、バイナリ検索がアレイの後半に行われた場合。
[概略]
模式図

バイナリサーチの実施例[テスト]

import java.util.Arrays;
/**
 * 二分法查找
 * @author 卟淡
 *
 */
public class ArrayBinarySeach {
	public static void main(String[] args) {
		int [] test = {15,12,16,10,17,19,18};
		Arrays.sort(test);	//排序(升序)
		
		System.out.println(Arrays.toString(test));	//输出完整数组
		
		System.out.println("该元素的位置为:" + Test(test,19));	
	}
	
	public static int Test(int[] test,int value) {
		//初始化开头结尾变量
		int low  = 0;
		int high = test.length-1;
		
		while(low <= high) {
			int mid = (low+high)/2;
			
			if(value==test[mid]) {
				return mid;
			}
			if(value > test[mid]) {	//检索的数比中间数大,则在右边取半进行检索
				low = mid +1;//中间一位加1赋回给low,再加最后一位位置数除以2,再继续向右进行折半检索。
			}
			if(value < test[mid]) {
				high = mid-1;//中间一位减1赋回给high,再加第一位元素位置(0),在继续向左折半检索。
			}
			
		}
		return -1;	//若low>high,则无法找到检索的数,返回-1值
		
	}
}

説明:

あなたは中央の数よりも大きい取得した場合、半分を取るために右、中央の1プラス2で割った最後の桁の位置で結合された低への1つの割り当てられたバックを取得し、その後、右にバイナリ検索を続けます。検索は、中間数の数よりも小さい場合、左半分を取ることはマイナスの高い中間バック、素子プラス最初の位置(0)を形成する、検索するために実行され、バイナリ探索は、左に進みます。

リリース9件のオリジナルの記事 ウォンの賞賛2 ビュー437

おすすめ

転載: blog.csdn.net/weixin_45625687/article/details/104784463