ソートを選択
基本的な紹介
選択的ソートは、指定された規則に従ってソートするデータから要素を選択し、規則に従って位置を交換してソートの目的を達成するという内部ソート方法にも属します。
ソート思考
選択ソートも簡単なソート方法です。その基本的な考え方は次のとおりです。
初回:配列から最小値を見つけてarray [0]と交換します。つまり、バブリング、スワッピングのように最小値を見つけるのではなく、配列をトラバースし、最小値を見つけてarray [0と交換します。 ]、一度だけ交換
2回目:配列配列のarray [1] ~~~ array [n-1]から最小値を見つけ、array [1]と交換します。このプロセスでは、交換は1回だけ行われます。
3回目:array [2]が最小値になります。。。。等々
合計n-1回渡すと、ソートコードに従って小さいものから大きいものへとソートされたシーケンスが取得されます。
アイデア
最初のラウンド:最初の位置を最小の数値と見なし、残りの配列のループを開始し、最小の値を最小の値に更新してから、現在の配列よりも小さい値を探します。1回のラウンドの後、最小の数値を見つけて、スワッピングを開始します
2番目のラウンド:2番目の位置を最小数と見なし、残りの配列のループを開始し、後で比較してそれよりも小さいことを確認し、最小値を更新してから、残りの数の最小数を見つけます。トラバーサル後、最初の位置と交換します
3回戦:同じ、3回目から
…。
ラウンドn-1まで
質問を聞いてください:
既存のセクション10の大学生、色の値は[100,10,35,24,16,79,4,2,57,80]で、低から高への選択ソートを使用してソートします
コード
派生プロセス:
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 21:32
* @Description TODO
* @pojectname 简单选择排序
*/
public class SelectSort {
public static void main(String[] args) {
int[] array = {
100,10,35,24,16,79,4,2,57,80};
selectSort(array);
}
//选择排序算法
public static void selectSort(int[] array){
//逐步推到方式
//第一轮排序
//原始数组[100,10,35,24,16,79,4,2,57,80]
//结果:[2,10,35,24,16,79,4,100,57,80]
int minIndex = 0;//用来存放,最小值的下标
int min = array[0];//假定现在最小值是数组第一个 也充当了中间值,来交换
for (int i = 0+1; i < array.length ; i++) {
if (min > array[i]){
//说明我们的假定最小值不是最小值
min = array[i]; //重置最小值
minIndex = i; //重置最小值索引
}
}
//循环结束,开始交换
if (minIndex != 0) {
array[minIndex] = array[0];
array[0] = min;
}
System.out.println("第一轮后:"+ Arrays.toString(array));
//第一轮后:[2, 10, 35, 24, 16, 79, 4, 100, 57, 80]
//第二轮排序
minIndex = 1;//用来存放,最小值的下标
min = array[1];//假定现在最小值是数组第一个 也充当了中间值,来交换
for (int i = 1+1; i < array.length ; i++) {
if (min > array[i]){
//说明我们的假定最小值不是最小值
min = array[i]; //重置最小值
minIndex = i; //重置最小值索引
}
}
//循环结束,开始交换
if (minIndex != 1) {
array[minIndex] = array[1];
array[1] = min;
}
System.out.println("第二轮后:"+ Arrays.toString(array));
//第二轮后:第二轮后:[2, 4, 35, 24, 16, 79, 10, 100, 57, 80]
//依次类推
}
}
導出の過程で、各forループの前に、開始マークが前のforループの開始位置よりも+1であることがわかりました。
次に、forループを使用して解決できます
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 21:32
* @Description TODO
* @pojectname 简单选择排序
*/
public class SelectSort {
public static void main(String[] args) {
int[] array = {
100,10,35,24,16,79,4,2,57,80};
System.out.println("排序前"+Arrays.toString(array));
selectSort(array);
System.out.println("排序后"+Arrays.toString(array));
}
//选择排序算法
public static void selectSort(int[] array){
for (int i = 0; i < array.length -1 ; i++) {
int minIndex = i;
int min = array[i];
for (int j = i+1; j <array.length ; j++) {
if (min > array[j]){
//说明假定的最小值不是最小
min = array[j];//重置min
minIndex = j;//重置最小值下标
}
}
//交换
if (minIndex != i){
array[minIndex] = array[i];
array[i] = min;
}
System.out.println("第"+i+"轮排序的结果是");
System.out.println(Arrays.toString(array));
}
}
}
言語で記憶を深めましょう:
外側のループは最初の並べ替えを制御し、内側のループは並べ替えの開始位置を制御するために使用されます
その中で、利点は何ですか?私たちのデータ交換方法は、バブルソートとは異なることがわかりました。これは、バブルソートとは異なり、要件を満たすたびに交換する交換であるため、選択ソートでは最小のものを使用します。値インデックスは、使用される中間補助変数です。一度だけ変更する
それで、私が第Nラウンドで取引する必要がない場合はどうなるか、と考える人もいます。交換時にif判定の層が追加されていることがわかりました。これは、現在の最小添え字が最初に想定した最小値の添え字であるかどうかを判定するために使用されます。交換されていない場合は出力されます。直接。、交換は発生しません。これは小さな最適化です。
次に、並べ替えを選択して配列を並べ替える時間を測定しました[80000]配列は、わずか2秒または3秒で、バブルソートよりもはるかに高速であることがわかりました。