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] + " ");
        }
    }
}
原文地址:https://www.cnblogs.com/xlwu/p/13170619.html