基础算法-选择排序算法
基础算法-选择排序算法
选择排序算法,个人觉得可以通过定位置选数值的想法来考虑。
比如数组中的第一个位置,就放数值最小的那个数;第二个位置,放数值第二小的那个数……依次类推,最后的一个位置,就放数值最大的那个数。由此,我们就可以完成整个数组,从小到大的升序排序。
想法有了,那我们要做的,就是在所有数中,为相应位置找到正确的数,并放置好。
以第1个位置的数a[0]为例,我们用a[0]和后面的数(a[1]、a[2]、a[3]……)逐个对比,只要发现比a[0]数值小,就和a[0]进行数值交换,交换完成,继续用a[0]和后面的数比较,如果还发现比当前a[0]的数值小,继续交换,重复这个步骤直到这一轮结束。
经过一轮比较下来,第1个位置上放置的数a[0]就是整个数组中,数值最小的数了。
后面的第2个位置、第3个位置……都是如此进行。
来看下具体的实现代码:
1package com.daily;
2
3import java.util.Arrays;
4
5/**
6 *
7 * @description
8 * 选择排序算法:
9 * 1、用双重循环实现,第一层循环,用以控制整个数组排序的轮数,,总共的排序轮数是arr.length-1,每一轮排序结束,都会确定好一个位置
10 * 2、第二层循环,用以控制当前这第i轮排序中,arr[i]这个数与后面每一个数(arr[i+1]、arr[i+2]......arr[arr.length-1])的比较
11 * 3、选择排序中,第一轮排序确定的是第一个位置的数(也是数值最小的),第二轮排序确定的是第二个位置的数,依次类推,将所有数按照先排数值小的再排数值大的,完成整个排序
12 *
13 * @author yuhuofei2021
14 * @date 2021年6月12日
15 */
16public class SelectionSort {
17
18 public static void main(String[] args) {
19 int[] arr = {3,9,72,1,56,20,2,50};
20 select(arr);
21 }
22
23 /**
24 *
25 * @description 选择排序具体实现
26 * @author yuhuofei2021
27 * @date 2021年6月12日
28 * @param arr
29 */
30 public static void select(int[] arr) {
31 for (int i = 0; i < arr.length - 1; i++) {
32 for (int j = i + 1; j <= arr.length - 1; j++) {
33 if (arr[i] > arr[j]) {
34 int temp = arr[i];
35 arr[i] = arr[j];
36 arr[j] = temp;
37 }
38 }
39 //每比较完一轮,打印出当前这一轮的比较结果
40 System.out.println("第"+ (i+1) + "轮排序的结果:" + Arrays.toString(arr));
41 }
42 //打印最后排序的结果
43 System.out.println("最后排序结果:" + Arrays.toString(arr));
44 }
45}
输出结果如下:
1第1轮排序的结果:[1, 9, 72, 3, 56, 20, 2, 50]
2第2轮排序的结果:[1, 2, 72, 9, 56, 20, 3, 50]
3第3轮排序的结果:[1, 2, 3, 72, 56, 20, 9, 50]
4第4轮排序的结果:[1, 2, 3, 9, 72, 56, 20, 50]
5第5轮排序的结果:[1, 2, 3, 9, 20, 72, 56, 50]
6第6轮排序的结果:[1, 2, 3, 9, 20, 50, 72, 56]
7第7轮排序的结果:[1, 2, 3, 9, 20, 50, 56, 72]
8最后排序结果:[1, 2, 3, 9, 20, 50, 56, 72]
从每一轮的输出结果,我们可以看出,一轮排序结束,都会确定下来一个位置上的数。例如,第1轮排序结束,确定了第1个位置上的数是1,第2轮结束确定了第2个位置上的数是2,第3轮则是3,第4轮则是9……
关于选择排序法,还可以考虑是否有可以优化的地方。