• 选择排序--Selection sort


    原理

    选择排序,是冒泡排序的优化。

    每一趟只交换一次。就是选择最大(或者最小的)和首位交换。

    例子

    现有无序数组[6 5 4 1 8 9]

    第一趟找到最小数1,放到最前边(与首位数字交换)

    交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

    交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

    第二趟找到余下数字[5 4 6 8 9]里的最小数4,与当前剩余数组的首位数字进行交换

    交换前:| 1 | 5 | 4 | 6 | 8 | 9 |

    交换后:| 1 | 4 | 5 | 6 | 8 | 9 |

    第三趟继续找到剩余[5 6 8 9]数字里的最小数5,实际没有交换,5在首位置无须交换

    第四趟从剩余的[6 8 9]里找到最小数6,实际没有交换

    第五趟从剩余的[8 9]里找到最小数8,发现它在正确的位置,没有交换

    排序完毕输出正确结果| 1 | 4 | 5 | 6 | 8 | 9 |

    第一趟找到最小数1的细节

    当前数组是| 6 | 5 | 4 | 1 | 8 | 9 |

    先把6取出来,让它扮演最小数

    当前最小数6与其它数一一进行比较,发现更小数就交换角色

    当前最小数6与5比较,发现更小数,交换角色,此时最小数是5,接下来5与剩余数字比较

    当前最小数5与4比较,发现更小数,交换角色,此时最小数是4,接下来4与剩余数字比较

    当前最小数4与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

    当前最小数1与8比较,不动

    当前最小数1与9比较,不动,到达末尾

    当前最小数1与当前首位数字进行位置交换,如下所示

    交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

    交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

    完成一趟排序,其余步骤类似

    参考代码

    /**
     * @Description:简单选择排序算法的实现
     */
    public class SelectSort {
        // -------------------------------------------------------
        // 第一趟排序: 原始数据:5 2 8 4 9 1
        // 最小数据1,把1放在首位,也就是1和5互换位置,
        // 排序结果:1 2 8 4 9 5
        // -------------------------------------------------------
        // 第二趟排序:
        // 第1以外的数据{2 8 4 9 5}进行比较,2最小,
        // 排序结果:1 2 8 4 9 5
        // -------------------------------------------------------
        // 第三趟排序:
        // 除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换
        // 排序结果:1 2 4 8 9 5
        // -------------------------------------------------------
        // 第四趟排序:
        // 除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换
        // 排序结果:1 2 4 5 9 8
        // -------------------------------------------------------
        // 第五趟排序:
        // 除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换
        // 排序结果:1 2 4 5 8 9
        // ------------------------------------------------------
    
        public static void selectSort(int[] arr) {
            if (arr == null || arr.length == 0)
                return;
            int minIndex = 0;
            // 选择排序,是冒泡排序的优化
            for (int i = 0; i < arr.length; i++) {// 只需要比较n-1次
                System.out.println("i======" + i);
                minIndex = i;
                for (int j = i + 1; j < arr.length; j++) {// 从i+1开始比较,因为minIndex默认为i了,i就没必要比了。
                    System.out.println("j======" + j);
                    if (arr[j] < arr[minIndex]) {
                        minIndex = j;
                    }
                }
                if (minIndex != i) { // 如果minIndex不为i,说明找到了更小的值,交换之。
                    swap(arr, i, minIndex);
                }
            }
    
            System.out.println("结果为==========================");
            for (int i : arr) {
                System.out.println(i);
            }
        }
    
        public static void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    
        public static void main(String[] args) {
            int[] arr = { 8, 10, 2, 1, 5, 4 };
            new SelectSort().selectSort(arr);
        }
    
    }
  • 相关阅读:
    UNIX网络编程——Socket通信原理和实践
    UNIX环境高级编程——单实例的守护进程
    UNIX环境高级编程——初始化一个守护进程
    UNIX环境高级编程——创建孤儿进程
    UNIX环境高级编程——实现uid to name
    CentOS7中使用yum安装Nginx的方法
    centos7配置IP地址
    关于Dubbo的原理以及详细配置
    关于Java大数操作(BigInteger、BigDecimal)
    关于JSON 与 对象 、集合之间的转换
  • 原文地址:https://www.cnblogs.com/llq1214/p/9717661.html
Copyright © 2020-2023  润新知