vlambda博客
学习文章列表

基础算法-选择排序算法

基础算法-选择排序算法

选择排序算法,个人觉得可以通过定位置选数值的想法来考虑。

比如数组中的第一个位置,就放数值最小的那个数;第二个位置,放数值第二小的那个数……依次类推,最后的一个位置,就放数值最大的那个数。由此,我们就可以完成整个数组,从小到大的升序排序。

想法有了,那我们要做的,就是在所有数中,为相应位置找到正确的数,并放置好。

以第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}

输出结果如下:

11轮排序的结果:[197235620250]
22轮排序的结果:[127295620350]
33轮排序的结果:[123725620950]
44轮排序的结果:[123972562050]
55轮排序的结果:[123920725650]
66轮排序的结果:[123920507256]
77轮排序的结果:[123920505672]
8最后排序结果:[123920505672]

从每一轮的输出结果,我们可以看出,一轮排序结束,都会确定下来一个位置上的数。例如,第1轮排序结束,确定了第1个位置上的数是1,第2轮结束确定了第2个位置上的数是2,第3轮则是3,第4轮则是9……

关于选择排序法,还可以考虑是否有可以优化的地方。