选择排序(Selection Sort)
核心思想:数据分为已排序区间和未排序区间。
选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。
代码:
public static void sort(int[] arrs) {
System.out.println("排序前的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
//控制总的循环次数,循环n-1次是因为n个数取n-1次之后,剩下最后一个数就不需要比较了
for(int i=0; i< arrs.length-1; i++) {
int min = i;
//每次循环找出剩余未排序的数据中最小的一个数
for(int j=i; j< arrs.length; j++) {
if(arrs[min] > arrs[j]) {
min = j;
}
}
//将最小的数放到已排序区间的最后
int temp = arrs[min];
arrs[min] = arrs[i];
arrs[i] = temp;
}
System.out.println();
System.out.println("排序后的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
}
输出:
排序前的数组:
6 2 7 1 2 10 3
第1次排序:
1 2 7 6 2 10 3
第2次排序:
1 2 7 6 2 10 3
第3次排序:
1 2 2 6 7 10 3
第4次排序:
1 2 2 3 7 10 6
第5次排序:
1 2 2 3 6 10 7
第6次排序:
1 2 2 3 6 7 10
排序后的数组:
1 2 2 3 6 7 10
从输出结果分析,第一次排序后的结果:1 2 7 6 2 10 3
从全部数组中,找出了最小的1,并把1和数组第一位置的6,做了互换;
第二次排序找到了最小的2,因为2本来就在第二的位置,所以数组整体顺序没变;
第三次排序找到了最小的另一个2,把2和第三个位置7租了互换;
依次排序…
关键逻辑分析
选择排序还是内外两层循环。
外层循环:
for(int i=0; i< arrs.length-1; i++)
控制总的循环次数,循环n-1次是因为n个数取n-1次之后,剩下最后一个数就不需要比较了。
内层循环:
int min = i;
for(int j=i; j< arrs.length; j++)
每次循环找出剩余未排序的数据中最小的一个数。