Java Fundamentals 07配列アルゴリズム(シーケンシャル検索、バブルソート、選択ソート、バイナリ検索)

プログラミングが好きなあなたのように!
SpringBoot実用的なコースは学習https://edu.csdn.net/course/detail/31433
SpringCloud入門コースを学びhttps://edu.csdn.net/course/detail/31451を


序文

配列の使用方法を知ったら、いくつかの実用的な問題を解決するために、配列を以前の知識と組み合わせる必要があります。
この記事では、配列の一般的なアルゴリズム(最大化、順次検索、バイナリ検索、バブルソート、選択ソート)について学習します。
これらのアルゴリズムを習得できれば、プログラミング能力が大幅に向上します。

最大値を見つける

配列を指定して、すべてのデータの中から最大(最小)のデータを見つけます。
アルゴリズムの説明:

  1. 最大値変数を定義し、配列の最初のデータを最大値に割り当てます
  2. 配列の2番目のデータから最後まで、変数を最大値と順番に比較します。データが最大値より大きい場合は、配列のデータを最大値に割り当てます。
  3. 最大出力
double[] numbers = {34,44,12,77,32.8,8,22.8,12,99,50};
//1、定义最大值变量,将数组中第一个数据赋值给最大值
double max = numbers[0];
int pos = 0;
//2、从数组的第二个数据开始到最后,依次和最大值变量进行比较
for(int i = 1;i < numbers.length;i++){
	//3、如果数据比最大值大,就把数组的数据赋值给最大值
	if(numbers[i] > max){
		max = numbers[i];
		pos = i;
	}
}
//4、输出最大值
System.out.println("最大值是:"+max+",位置是:"+(pos + 1));

順次検索

配列と検索するデータを指定して、配列内のデータの位置を見つけます。
アルゴリズムの説明:

  1. 配列、位置変数を定義し、検索する番号を入力します
  2. 最初から最後まで循環し、見つけたい数と比較します
  3. それらが等しくない場合は、次のものを見つけ、それらが等しい場合は、その位置に添え字を保存します
  4. 出力場所
Scanner input = new Scanner(System.in);
int[] numbers = {43,44,77,44,88};
System.out.println("输入你要找的数字:");
int num = input.nextInt();
int pos = -1;
for(int i = 0;i < numbers.length;i++){
	if(num == numbers[i]){
		pos = i;
		break;
	}
}
if(pos == -1){
	System.out.println("没有找到该数");
}else{
	System.out.println("该数字的位置是:"+pos);
}

バブルソート


配列を最小から最大(最大から最小)に並べ替えます。配列ペアの各データをペアで比較します。前の数値が大きい場合は、2つの数値を交換します。
アルゴリズムの説明:

  1. 複数ラウンドの比較
  2. 比較の各ラウンドで、2つの隣接するデータを比較し、大きい方のデータを後ろに交換します

アルゴリズムの分析:

  1. アウターループコントロール比較ラウンド(長さ-1)
  2. 内部ループ制御の前後の2つの数値の比較数(長さ-1の丸め数値)
  3. 内側のループで隣接する2つのデータを比較し、大きい方のデータを後ろに交換します
//外层循环控制比较的轮数
for(int i = 0;i < numbers.length - 1;i++){
	//内层循环控制前后两个数的比较次数(长度-1-轮数)
	for(int j = 0;j < numbers.length - 1 - i;j++){
		//在内层循环中将相邻的两个数据进行比较,将较大的交换到后面
		if(numbers[j] > numbers[j+1]){
			int temp = numbers[j];
			numbers[j] = numbers[j+1];
			numbers[j+1] = temp;
		}
	}
}

ソートを選択

配列内の最大のデータを最初のデータと交換し
、2番目に大きいデータを2番目のデータと交換します
...
アルゴリズムの説明:

  1. 複数のラウンドに分割
  2. ラウンドの最大(小さい)値の位置は、毎回前のデータと交換されます

アルゴリズムの分析:

  1. アウターループ制御ラウンド数(長さ-1)
  2. 最小位置を見つけるための内部ループ制御(範囲:rounds〜length-1)
  3. 最小値のデータをラウンドの最初の番号と交換します
//外层循环控制轮数(长度-1)
for(int i = 0;i < numbers.length - 1;i++){
	//保存该轮的第一个数的位置为最小值的位置
	int min = i;
	//内层循环控制找最小值位置(范围:轮数~长度-1)
	for(int j = i;j < numbers.length;j++){
		//找最小值的位置
		if(numbers[j] < numbers[min]){
			min = j;
		}
	}
	//将最小的数据和该轮的开始位置交换
	if(min != i){
		int temp = numbers[min];
		numbers[min] = numbers[i];
		numbers[i] = temp;
	}
}

バイナリ検索

二分探索は順序付けられた配列にのみ使用でき、より効率的です

アルゴリズムの説明:

  1. 開始位置と終了位置を定義します
  2. 開始位置と終了位置の間の値を見つけます
  3. 中央の値が探している数値よりも大きい場合は、後続の数値をすべて削除します(中央の位置を終了位置に割り当てます)
  4. 中央の値が探している数値よりも小さい場合は、前の数値をすべて削除します(中央の位置を開始位置に割り当てます)
  5. 真ん中の数字が探している数字と等しい場合、それが見つかり、クエリは終了します
  6. 上記のプロセスをループに書き込みます。条件の開始位置が終了位置以下です。
int[] numbers = {10,20,30,40,50,60,80};
System.out.println("输入你要找的数字:");
int num = input.nextInt();
int result = -1;
//定义开始位置
int start = 0;
//定义结束位置
int end = numbers.length - 1;
//循环进行查找,开始位置<=结束位置
while(start <= end){
	//取中间的值的下标
	int middle = (start + end) / 2;
	//如果中间的值大于要找的数,淘汰中间数后面的所有数
	if(numbers[middle] > num){
		//将中间位置赋值给结束位置
		end = middle - 1;
	}
	//如果中间的值小于要找的数,淘汰中间数前面的所有数
	else if(numbers[middle] < num){
		//将中间位置赋值给开始位置
		start = middle + 1;
	}
	//如果中间数等于要找的数,就找到了,结束查询
	else{
		result = middle;
		break;
	}
}
if(result == -1){
	System.out.println("没有找到!");
}else{
	System.out.println("找到了!位置是:"+result);
}

終わり

この記事は終わりました。あなたがそれをマスターしたかどうかはわかりません。宿題を残して確認してください
。1。クラスには10人の生徒がいます。各生徒のスコアを入力し、最終的に平均と最高のスコアを取得します。
2. 5人の名前の配列を指定して、検索する名前を入力し、配列内での位置を見つけます。
3.長さ10の整数配列を定義し、同時に10個の初期値を指定し、配列を並べ替えます
。4。バイナリ検索を使用して、上記の配列内の数値の位置を見つけます。
5. 0〜9の乱数を取得し、長さ10の配列に格納します。乱数を繰り返してはなりません。


他のJavaの知識を学ぶ必要がある場合は、ここでJavaの概要に関する非常に詳細な知識を調べてください。

おすすめ

転載: blog.csdn.net/u013343114/article/details/112314935