• 算法之选择排序


    选择排序

    从学校到工作,用的最多的就是选择排序,最具讽刺的是用的还是交换次数最多的选择排序。虽然不是学软件的,也实在是汗颜啊。
    算法第四版:

    首先找到数组中最小的元素,将它和数组的第一个元素交换位置;如果第一个元素是最小的元素与自己交换
    再次将剩下的元素找到最小的元素与第二个交换位置;
    如此往复直到将整个数组排序
    

    时间复杂度

    交换次数是N次,比较次数是N的平方的二分之一。无法如何排序,比较次数都没变化。

    与冒泡、插入排序相比

    冒泡排序和插入排序的交换次数最坏都是N的平方的二分之一

    例子

    package com.java.arlgorithm.sort;
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.Arrays;
    
    /**
     * @author
     */
    @Slf4j
    public class ChooseInserTest {
        public static void main(String[] args) {
            int[] array = new int[]{5, 6, 4, 3, 1, 6};
            chooseInsert(array);
        }
    
        //交换次数太多
        public static void chooseInsertBad(int[] array) {
            int len = array.length;
            for (int i = 0; i < len; i++) {
                int tmp = array[i];
                for (int j = i + 1; j < len; j++) {
                    if (less(array[j], tmp)) {
                        swap(array, i, j);
                    }
                }
                printAll(array);
            }
    
        }
    
        public static void chooseInsert(int[] array) {
            int len = array.length;
            for (int i = 0; i < len; i++) {
                int min = i;
                for (int j = i + 1; j < len; j++) {
                    if (less(array[j], array[min])) {
                        min = j;
                    }
                }
                swap(array, i, min);
                printAll(array);
            }
    
        }
    
        public static void swap(int[] array, int src, int des) {
            int tmp;
            tmp = array[src];
            array[src] = array[des];
            array[des] = tmp;
        }
    
        public static void printAll(int[] array) {
            log.info(Arrays.toString(array));
        }
    
        public static boolean less(int a, int b) {
            if (a < b) {
                return true;
            }
            return false;
        }
    }
    
    
    

    结果

    2019-08-20 15:51:56,687   [main] INFO  ChooseInserTest  - [1, 6, 4, 3, 5, 6]
    2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 6, 5, 6]
    2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 6, 5, 6]
    2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
    2019-08-20 15:51:56,692   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
    2019-08-20 15:51:56,693   [main] INFO  ChooseInserTest  - [1, 3, 4, 5, 6, 6]
    
  • 相关阅读:
    查看内置命令和非内置命令帮助的几种方法(man、help、info)
    手写js的insertAfter
    Java 单链表简单实现
    StudentMain控屏后如何关闭
    python3 twisted问题
    python3 you-get
    数据库方言(这是啥玩意儿?)
    vi/vim用法
    sublime text3
    数据库命令大全(也不是很全哈)
  • 原文地址:https://www.cnblogs.com/JuncaiF/p/11383398.html
Copyright © 2020-2023  润新知