免責事項:ご質問がある場合は、[感情] 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));
//当只有一个循环是得到最大元素,还需要嵌套一个循环,
//把前面的元素再重复比较
[結果]
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("------------");
}
[結果]
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)を形成する、検索するために実行され、バイナリ探索は、左に進みます。