• 小白懂算法之选择排序


    一.选择排序原理

      假设有10个数。

      第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第一个数和第三个数比较,如果第一个数大,第一个数和第三个数交换位置,否则不动……第一个数和第十个数比较,如果第一个数大,第一个数和第十个数交换位置,否则不动。第一轮循环结束,最小的数挪到了第一个数的位置,比较进行了9次。
      第二轮循环,第二个数和第三个数比较,如果第二个数大,第而个数和第三个数交换位置,否则不动……第二个数和第十个数比较,如果第二个数大,第二个数和第十个数交换位置,否则不动。第二轮循环结束,第二小的数挪到了第二个数的位置,比较进行了8次。
      ……
      第九轮循环,第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第九轮循环结束,倒数第二小的数挪到了倒数第二个的位置,比较进行了1次。

      总结:假设序列中有n个数,当前元素与它后面的元素逐一比较,比较结果要么交换数值,要么不动。

        1.比较的最大轮数为n-1轮

        2.第一轮比较的次数为n-1次,第n-1轮比较1次。

        3.每轮比较后都会确定一个最值,该值不参与到下轮的比较中

        4.除第一轮外,每轮的当前元素位置都是前一轮元素位置+1

    二.图解

     

     三.代码实现

      语言采用Java来实现

        /**
         *     选择排序方法
         * @param arr:需要排序的序列
         * @return
         */
        public static int[] ChoiceSortByFor(int[] arr) {
            /**
             *     实现思路:双重循环
             *         1.最外层的次数最大为 arr.length -1
             *         2.内层的第一次比较次数为arr.length -1,之后每轮比较次数-1,每轮当前元素的位置是上轮位置+1
             *         3.若当前值大于后面值,则交换位置,否则不冻港
             */
            int temp = 0; //两者交换的中间值
            for(int i=0;i<arr.length-1;i++)    //最外层的次数最大为 arr.length -1
                for(int j=i;j<arr.length-1;j++) {    //内层的第一轮比较次数为arr.length -1,之后每轮比较次数-1,每轮当前元素的位置是上轮位置+1
                    //若当前值大于后面值,则交换数值
                    if(arr[i]>arr[j+1]) {
                        temp = arr[i];
                        arr[i] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            return arr;
        }

      main方法测试:

        public static void main(String[] args) {
            //创建一个需要排序的数组
            int[] arr = new int[] {520,1314,618,1111,521,666,38};
            
            //调用选择排序的方法,返回一个排序后的序列
            int[] sortedArr = ChoiceSortByFor(arr);
            //遍历序列
            for(int i=0;i<sortedArr.length;i++) {
                System.out.print(sortedArr[i]+" ");
            }
            
        }

     https://blog.csdn.net/weixin_39294633/article/details/80231033

  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13967963.html
Copyright © 2020-2023  润新知