選択ソートとは何ですか
ソート選択ソートアルゴリズムである、時間の複雑さは、単純なように書くことができO(n x n)
、非常に高速にスマートではなく、アルゴリズム
一般的な考え方:反復する、反復最小値を除去しながら、結果アレイ、アレイの体積減少に最小値アレイを介して時間がかかっは、トラバースを続行します
、すなわち>最小体積減少- - >繰り返しステップの結果アレイ場所における最小値
ステップの種類を選択します
配列を指定して、
元の配列を作成するために長い配列、等の結果
二つの変数と最小配列座標が記録されている最小値を使用して
比較値が現在の最小値が最小電流値が交換された未満である場合に横断続けるそうでなければ、アレイ内の他の要素に比べて最初の元の値をとります
配列の最初の結果に戻り、現在の横断完全な配列インデックスの最小値、元の配列の最小値、2を得た最初のパス
次に、指定された配列、狭いアレイ、与えるための第2のパスを除去するために必要な最低限の3
狭めた後、アレイを通るたびに、結果の配列に最小値を見つける、埋めるために、得られた配列まで再び最後のアレイ上に収縮低減
最後に結果の配列を取得
Java実装
package com.github.hellxz.grokkingalgorithms.selectionsort;
/**
* 选择排序
*/
public class SelectionSort {
public static int[] selectionSort(int[] arr) {
//创建结果数组
int[] solution = new int[arr.length];
for (int i = 0; i < solution.length; i++) {
//获得当前arr最小值下标
int smallestIndex = findSmallestIndex(arr);
//将当前arr最小值放到结果数组
solution[i] = arr[smallestIndex];
//arr缩容,去除最小值
arr = newArrayWithoutLastSmallest(arr, smallestIndex);
}
return solution;
}
/**
* 返回去掉给定值的新数组
*/
private static int[] newArrayWithoutLastSmallest(int[] arr, int lastSmallestIndex) {
int[] newArr = new int[arr.length - 1];
for (int i = 0; i < arr.length; i++) {
if (i < lastSmallestIndex) {
newArr[i] = arr[i];
} else if(i > lastSmallestIndex) {
newArr[i-1] = arr[i];
}
}
return newArr;
}
/**
* 查找给定数组最小值下标
*/
private static int findSmallestIndex(int[] arr) {
int smallest = arr[0];
int smallestIndex = 0;
for (int i = 0; i < arr.length; i++) {
if (smallest > arr[i]) {
smallest = arr[i];
smallestIndex = i;
}
}
return smallestIndex;
}
public static void main(String[] args) {
int[] arr = {8, 6, 7, 5, 3, 2, 4};
int[] sortedArr = selectionSort(arr);
for (int i = 0; i < sortedArr.length; i++) {
System.out.print(sortedArr[i]);
}
}
}