作者:流川メイプルノックコード
ブログホームページ:流川楓のブログ
コラム:私と一緒にJavaを学ぼう
引用:ハングリーでいて、愚かでいて
良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com
記事ディレクトリ
1. アルゴリズム的思考
1. 配列内の最大 (最小) 要素を見つける
2.配列の最初の要素と交換します(最初の要素が最大または最小の要素である場合は、自分自身と交換します)
3. 残りの要素の中から最大 (最小) の要素を見つけ、それを配列の 2 番目の要素と交換し、配列全体がソートされるまでループします
残った要素の中から最大(最小)の要素を連続的に選んで並べ替えるアルゴリズムなので、セレクションソートと呼ばれる
2. アルゴリズム図
配列配列ダイアグラムによるソートを選択すると、ソート結果は昇順になります
int[] array = {25,33,10,15,70,45};
各ループの先頭にある最初の数値が常に最小であると仮定すると、minIndex は最小の数値の添字 i を保持します。i の範囲は 0 から array.length-1 です。
配列のトラバースを開始し、最小の数値を見つけ、インデックスを保存し、最小の数値を現在の minIndex が指す数値と交換します。
最小数が 33 であると仮定して、逆方向にトラバースを開始し、最小数 15 を見つけて、スワップします。
サイクルを続けて、現在25が最小、自分と交換
サイクルを続けて、現在33が最小、自分と交換
ループを継続し、最小数は 45 で、70 が交換されます
サイクルを継続、現在70が最小、自分と交換
ここまで並べ替え完了
3. コードの実装
import java.util.Arrays;
public class ChoiceSort{
public int[] sortArray(int[] nums){
if(nums.length == 0){
return nums;
}
for (int i = 0; i < nums.length; i++) {
int minIndex = i;//最小数的下标,每个循环开始总是假设第一个数是最小数
for (int j = i; j < nums.length; j++) {
if (nums[j] < nums[minIndex]){//找到最小数
minIndex = j;//保存最小数索引
}
}
System.out.println("本轮最小数:"+nums[minIndex]);
//交换最小数和当前i所指向的元素
int tmp = nums[minIndex];
nums[minIndex] = nums[i];
nums[i] = tmp;
PrintArray.print(nums);
System.out.println("————————————————");
}
return nums;
}
public static void main(String[] args) {
int[] array = {25,33,10,15,70,45};
System.out.println("初始数组:");
PrintArray.print(array);
ChoiceSort choiceSort = new ChoiceSort();
choiceSort.sortArray(array);
System.out.println("排序完成");
PrintArray.print(array);
}
}
class PrintArray{
public static void print(int[] array){
System.out.println(Arrays.toString(array));
}
}
結果:
4. 選択ソートアルゴリズムの最適化
アイデア: 通常、1 回のトラバーサルで最大値と最小値を同時に見つけて、それらを配列の両端に配置すると、トラバーサルの回数を半分に減らすことができます
配列をトラバースして最大値と最小値を見つけ、最小値を配列の左側に置き、最大値を配列の右側に置き、並べ替えが完了するまで操作を繰り返します
コード:
import java.util.Arrays;
public class ChoiceSort{
public int[] sortArray(int[] nums) {
if (nums.length == 0) {
return nums;
}
/*初始化左端、右端元素索引*/
int left = 0;
int right = nums.length - 1;
while (left < right) {
/*初始化最小值、最大值元素的索引*/
int min = left;
int max = right;
for (int i = left; i <= right; i++) {
/*标记每趟比较中最大值和最小值的元素对应的索引min、max*/
if (nums[i] < nums[min])
min = i;
if (nums[i] > nums[max])
max = i;
}
/*最大值放在最右端*/
int temp = nums[max];
nums[max] = nums[right];
nums[right] = temp;
/*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
if (min == right)
min = max;
/*最小值放在最左端*/
temp = nums[min];
nums[min] = nums[left];
nums[left] = temp;
/*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
left++;
right--;
}
return nums;
}
public static void main(String[] args) {
int[] array = {25,33,10,15,70,45};
System.out.println("初始数组:");
PrintArray.print(array);
ChoiceSort choiceSort = new ChoiceSort();
choiceSort.sortArray(array);
System.out.println("排序完成");
PrintArray.print(array);
}
}
class PrintArray{
public static void print(int[] array){
System.out.println(Arrays.toString(array));
}
}
結果:
5. 選択ソート機能
ソート対象のシーケンスでは、要素数が少ない場合、選択ソートを使用するのが適切であり、
ソート対象のシーケンスに元と等しい要素が存在する場合、時間計算量は O(n2) . になります。両端の要素、安定性が破壊される可能性があります
「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!