zoukankan      html  css  js  c++  java
  • 选择排序--Selection sort

    原理

    选择排序,是冒泡排序的优化。

    每一趟只交换一次。就是选择最大(或者最小的)和首位交换。

    例子

    现有无序数组[6 5 4 1 8 9]

    第一趟找到最小数1,放到最前边(与首位数字交换)

    交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

    交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

    第二趟找到余下数字[5 4 6 8 9]里的最小数4,与当前剩余数组的首位数字进行交换

    交换前:| 1 | 5 | 4 | 6 | 8 | 9 |

    交换后:| 1 | 4 | 5 | 6 | 8 | 9 |

    第三趟继续找到剩余[5 6 8 9]数字里的最小数5,实际没有交换,5在首位置无须交换

    第四趟从剩余的[6 8 9]里找到最小数6,实际没有交换

    第五趟从剩余的[8 9]里找到最小数8,发现它在正确的位置,没有交换

    排序完毕输出正确结果| 1 | 4 | 5 | 6 | 8 | 9 |

    第一趟找到最小数1的细节

    当前数组是| 6 | 5 | 4 | 1 | 8 | 9 |

    先把6取出来,让它扮演最小数

    当前最小数6与其它数一一进行比较,发现更小数就交换角色

    当前最小数6与5比较,发现更小数,交换角色,此时最小数是5,接下来5与剩余数字比较

    当前最小数5与4比较,发现更小数,交换角色,此时最小数是4,接下来4与剩余数字比较

    当前最小数4与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

    当前最小数1与8比较,不动

    当前最小数1与9比较,不动,到达末尾

    当前最小数1与当前首位数字进行位置交换,如下所示

    交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

    交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

    完成一趟排序,其余步骤类似

    参考代码

    /**
     * @Description:简单选择排序算法的实现
     */
    public class SelectSort {
        // -------------------------------------------------------
        // 第一趟排序: 原始数据:5 2 8 4 9 1
        // 最小数据1,把1放在首位,也就是1和5互换位置,
        // 排序结果:1 2 8 4 9 5
        // -------------------------------------------------------
        // 第二趟排序:
        // 第1以外的数据{2 8 4 9 5}进行比较,2最小,
        // 排序结果:1 2 8 4 9 5
        // -------------------------------------------------------
        // 第三趟排序:
        // 除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换
        // 排序结果:1 2 4 8 9 5
        // -------------------------------------------------------
        // 第四趟排序:
        // 除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换
        // 排序结果:1 2 4 5 9 8
        // -------------------------------------------------------
        // 第五趟排序:
        // 除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换
        // 排序结果:1 2 4 5 8 9
        // ------------------------------------------------------
    
        public static void selectSort(int[] arr) {
            if (arr == null || arr.length == 0)
                return;
            int minIndex = 0;
            // 选择排序,是冒泡排序的优化
            for (int i = 0; i < arr.length; i++) {// 只需要比较n-1次
                System.out.println("i======" + i);
                minIndex = i;
                for (int j = i + 1; j < arr.length; j++) {// 从i+1开始比较,因为minIndex默认为i了,i就没必要比了。
                    System.out.println("j======" + j);
                    if (arr[j] < arr[minIndex]) {
                        minIndex = j;
                    }
                }
                if (minIndex != i) { // 如果minIndex不为i,说明找到了更小的值,交换之。
                    swap(arr, i, minIndex);
                }
            }
    
            System.out.println("结果为==========================");
            for (int i : arr) {
                System.out.println(i);
            }
        }
    
        public static void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    
        public static void main(String[] args) {
            int[] arr = { 8, 10, 2, 1, 5, 4 };
            new SelectSort().selectSort(arr);
        }
    
    }
  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/llq1214/p/9717661.html
Copyright © 2011-2022 走看看