码迷,mamicode.com
首页 > 编程语言 > 详细

排序--选择排序

时间:2019-10-20 18:01:30      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:href   for   对比   index   col   get   lan   ring   规则   

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),但是相比冒泡排序,每轮排序是找到最小的然后移动到首部,操作数少于冒泡排序的操作数,执行时间也比冒泡排序快些

排序--选择排序

标签:href   for   对比   index   col   get   lan   ring   规则   

原文地址:https://www.cnblogs.com/han200113/p/11708045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!