zoukankan      html  css  js  c++  java
  • 排序算法-选择排序

    选择排序

     流程:

      遍历整个数组找到最小的数,和索引为0的元素交换位置

      再次遍历数组,找到第二小的元素和索引为1的元素交换位置

      遍历 length-1 次...

      (只有第一次是遍历整个数组,选择排序完成了的元素就不用在遍历了)

      时间复杂度:O(n^2)

      代码实现(java):

        public static void main(String[] args) {
            int[] arrs = {5, 20, 100, 50, 1, 40, 2};
            chooseSort(arrs);
        }
        
        private static void chooseSort(int[] arrs) {
            //遍历次数 length-1 次即可(当然遍历length也不会出现报错,最大程度追求效率)
            for(int i = 0;i < arrs.length - 1;i++){
                int index = i;
                //遍历找最小的元素
                for(int j = i;j < arrs.length;j++){
                    if(arrs[j] < arrs[index]){
                        index = j;
                    }
                }
                //如果此次遍历得到的最小元素不是当前最小索引位置的元素 则交换位置
                if(arrs[index] != arrs[i]){
                    repalceIndex(arrs, index, i);
                }
            }
            for (int i : arrs) {
                System.out.println(i);
            }
        }
    
        //交换元素位置的方法
        private static void repalceIndex(int[] arrs, int small, int i) {
            int temp = arrs[small];
            arrs[small] = arrs[i];
            arrs[i] = temp;
        }

    在选择排序的基础上衍生出或者说是一种优化效率的选择排序:双向选择排序

    双向选择排序

     流程:

      遍历整个数组找到最小的数min,最大的数max,最小的数和索引为0的元素交换位置,最大的数和索引为length - 1的元素交换位置

      再次遍历数组,最小的数min,最大的数max,最小的数和索引为1的元素交换位置,最大的数和索引为length - 2的元素交换位置

      遍历 length/2 次...

      好处是减少了遍历了次数,遍历次数大约减少一半。

      时间复杂度:O(n^2/2) 

      代码实现(java):

     1     public static void main(String[] args) {
     2         int[] arrs = {5, 20, 100, 50, 1, 40, 2, 0};
     3         chooseSort2(arrs);
     4     }
     5 
     6     /**
     7      * 双向选择排序
     8      * @param arrs
     9      */
    10     private static void chooseSort2(int[] arrs) {
    11         //遍历次数
    12         for(int i = 0;i < arrs.length / 2 ;i++){
    13             //本次遍历的最小和最大索引
    14             int small = i;
    15             int big = arrs.length - 1 - i;
    16             for(int j = i;j < arrs.length - i;j++){
    17                 if(arrs[j] < arrs[small]){
    18                     small = j;
    19                 }
    20                 if(arrs[j] > arrs[big]){
    21                     big = j;
    22                 }
    23             }
    24             //如果此次遍历得到的最小元素不是当前最小索引位置的元素 则交换位置
    25             if(arrs[small] != arrs[i]){
    26                 repalceIndex(arrs, small, i);
    27             }
    28             //如果此次遍历得到的最大元素不是当前最大索引位置的元素 则交换位置
    29             if(arrs[big] != arrs[arrs.length - 1 - i]){
    30                 repalceIndex(arrs, big, arrs.length - 1 - i);
    31             }
    32         }
    33         for (int i : arrs) {
    34             System.out.println(i);
    35         }
    36     }
    37     
    38     //交换元素位置的方法
    39     private static void repalceIndex(int[] arrs, int small, int i) {
    40         int temp = arrs[small];
    41         arrs[small] = arrs[i];
    42         arrs[i] = temp;
    43     }

    以上为自己编译通过的代码以及结合部分书籍得出来的结论,如有不对还望指出!

      

  • 相关阅读:
    Mysql中的递归查询
    让git忽略对已经版本控制的文件的本地修改
    关于c#中逆变和协变的理解
    把之前的相关博客都迁到了博客园~
    结合github pages使用travis CI
    Spring中的Filter、HandlerInterceptor和AOP
    HDU1711 Number Sequence 题解 KMP算法
    HDU1358 Period 题解 KMP算法
    HDU1686 Oulipo 题解 KMP算法
    HDU3336 Count the string 题解 KMP算法
  • 原文地址:https://www.cnblogs.com/liyong888/p/11199361.html
Copyright © 2011-2022 走看看