zoukankan      html  css  js  c++  java
  • java数组中的选择排序

    选择排序:
            选择排序比冒泡排序的效率高。
            高在交换位置的次数上。
            选择排序的交换位置是有意义的。
            
            循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和最前面的数据进行交换。
            
            3 1 6 2 5
            
            参与比较的数据:3 1 6 2 5    (这一堆参加比较的数据中最左边的元素下标是0)
            第一次循环之后的结果是:
            1 3 6 2 5
            
            参与比较的数据:3 6 2 5    (这一堆参加比较的数据中最左边的元素下标是1)
            第二次循环之后的结果是:
            2 6 3 5
            
            参与比较的数据:6 3 5    (这一堆参加比较的数据中最左边的元素下标是2)
            第三次循环之后的结果是:
            3 6 5
            
            参与比较的数据:6 5    (这一堆参加比较的数据中最左边的元素下标是3)
            第四次循环之后的结果是:
            5 6
            
            注意:5条数据循环4次。
     
     
    选择排序代码:
    package com.javaSe.Arrays;
    /*
    选择排序:
        每一次从这堆参与比较的数据当中找出最小值,拿着这个最小值和“参与比较的这个最前面的元素”交换位置。
        
        选择排序比冒泡排序好在:每一次的交换位置都是有意义的。
        
        关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。
            3 2 6 1 5
            假设:
                第一个3是最小的
                3和2比较,发现2更小,所以此时最小的是2
                继续拿着2往下比对,2和6比较,2仍然是最小的
                继续拿着2往下比对,2和1比较,发现1更小,所以此时1是最小的。
                继续拿着1往下比对,1和5比对,发现1还是小的,所以1是最小的。
                
                拿着1和最左边的3进行交换位置。
                
            2 6 3 5
            假设:
                第一个2是最小的。
                ...
                
            6 3 5
            假设6是最少的
            6和3进行比对,发现3更小,所以此时3是最小的
            ...
            
            
     */
    public class SelectSort {
        public static void main(String[] args) {
            // int[] arr = {3,1,6,2,5};
            int[] arr = {9,8,10,7,6,0,11};
            
            int count = 0;
            int count2 = 0;
            // 选择排序
            // 5条数据循环4次。(外层循环4次)
            
            for (int i = 0; i < arr.length - 1; i++) {
                // i的值是0 1 2 3
                // i正好是“参加比较的这堆数据”最左边那个元素的下标
                // i 是一个参与比较D额这堆数据中的起点下标。
                // 假设起点i下标位置上的元素是最小的。
                int min = i;
                // System.out.println(i);
                for (int j = i + 1; j < arr.length; j++) {
                    // System.out.println("=====>" + j);
                    if(arr[j] < arr[min]){
                        min = j;// 最小值的元素下标是j
                    }
                    count++;
                }
                
                // 当i和min相等时,表示最初猜测是对的
                // 当i和min不相等时,表示最初的猜测是错的,有比这个元素更小的元素,需要拿着这个更小的元素和最左边的元素交换位置。
                if (min != i) {
                    // 表示存在更小的数据
                    // arr[min] 最小的数据
                    // arr[i] 最前面的数据
                    int temp;
                    temp = arr[min];
                    arr[min] = arr[i];
                    arr[i] = temp;
                    count2++;
                }
            }
            
            // 冒泡排序和选择排序实际上比较的次数没变。
            // 交换位置的次数减少了。
            System.out.println("选择排序循环的次数是:" + count);
            System.out.println("交换位置的次数是:" + count2);
            // 排序之后遍历
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + " ");
            }
        }
    }
  • 相关阅读:
    OC-内存管理-基本原理与引用计数器
    OC-改错题
    OC-Q&A
    OC-SEL
    CO-类的本质、description方法
    Tomcat 下 mysql的连接池配置和使用
    转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
    使应用程序常驻内存,不能被任务管理器关闭之配置文件设置
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    >/dev/null 2>&1的含义
  • 原文地址:https://www.cnblogs.com/xlwu/p/13170619.html
Copyright © 2011-2022 走看看