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

    1、什么是选择排序?

    选择排序是从未排序的队列中找到最小的元素,把这个最小的元素放在首部,接着继续从剩下的未排序的队列中找最小元素,放在原来已经排序元素的后面

    2、代码原理

    1. 选择排序一共有数组大小-1轮排序
    2. 每1轮排序,内部又是一个循环,循环的规则:
      • 先假定当前未排序元素中第一个是最小数
      • 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
      • 当遍历到数组的最后时,就得到本轮最小数和下标
      • 交换代码中再继续回到1进行新一轮排序

    3、代码逐步实现:

    //需要排序的数组
    int[] arr={101,34,119,1};

    由上面原理可知,该数组需要进行 3 (arr.length-1)轮排序

    //第一轮 
    int minIndex=0;   //假设最小数是数组第一个元素的下标
    int min=arr[minIndex]; //最小数的值
    for (int i=0+1;i<arr.length;i++){ //从最小数后面开始进行循环比较
                if (min>arr[i]){  //当遇到比设置的最小值还小的数时
                    minIndex=i;   //将最小值下标移动到找到的新的最小值
                    min=arr[i];   //将当前这个最小值记录下来
                }
            }
            if (minIndex!=0){    //等于0说明后面没找到比预置的最小值更小的,所以不用交换位置
                arr[minIndex]=arr[0];
                arr[0]=min;
    
            }
            System.out.println("第一轮:"+Arrays.toString(arr));
            //第二轮
            minIndex=1;//假设最小值下标为剩余未排序的第一个元素的下标
            min=arr[minIndex];   
            for (int i=1+1;i<arr.length;i++){
                if (min>arr[i]){
                    minIndex=i;
                    min=arr[i];
                }
            }
            if (minIndex!=1){
                arr[minIndex]=arr[1];
                arr[1]=min;
    
            }
            System.out.println("第二轮:"+Arrays.toString(arr));    
    //第三轮
            minIndex=2;//假设最小值下标为剩余未排序的第一个元素的下标
            min=arr[minIndex];   
            for (int i=1+1;i<arr.length;i++){
                if (min>arr[i]){
                    minIndex=i;
                    min=arr[i];
                }
            }
            if (minIndex!=2){
                arr[minIndex]=arr[2];
                arr[2]=min;
    
            }
            System.out.println("第三轮:"+Arrays.toString(arr));    

    上面已经排序完成了,对比上面三轮的代码,有很多相似之处,接下来合并起来

    for (int j=0;j<arr.length-1;j++){
    
                int minIndex=j;
                int min=arr[minIndex];
                for (int i=1+j;i<arr.length;i++){
                    if (min>arr[i]){
                        minIndex=i;
                        min=arr[i];
                    }
                }
                if (minIndex!=j){
                    arr[minIndex]=arr[j];
                    arr[j]=min;
                }
            }
            System.out.println("排序完成后:"+Arrays.toString(arr));

    4、时间复杂度

    因为排序用到了两个for循环,所以时间复杂度时O(n^2),但是相比冒泡排序,每轮排序是找到最小的然后移动到首部,操作数少于冒泡排序的操作数,执行时间也比冒泡排序快些

  • 相关阅读:
    Oracle诊断:在程序的运行中,有时候数据库会断开连接
    Linux shell
    Java继承和多态-Static关键字
    Oracle诊断:使用USER_SEGMENTS分配给表的物理空间大小
    Linux shell -查找字符(find,xargs,grep)
    Linux shell
    Linux shell
    Linux shell
    Java heap size
    Oracle诊断: 服务器启后,无法连接
  • 原文地址:https://www.cnblogs.com/han200113/p/11708045.html
Copyright © 2011-2022 走看看