数据结构与算法-排序算法2-选择排序

目录

1.选择排序:

1.介绍:

2.动态图解

3.举例

4.小结选择排序规则

5.选择排序代码

6.运行时间

代码:

运行结果:


1.排序算法简介

排序也称为排序算法。排序是将一组数据依据指定的顺序进行排列的过程。

2.常见的排序算法分类如下图:

稳定性口诀:

选泡插,快归堆希桶计基,不稳稳稳不稳稳,不稳不稳稳稳稳

3.选择排序:

1.介绍:

数组中n个元素,从数组第一个元素开始到最后一个元素,第一次从arr[0]到arr[n-1]中选取最小值min1,如果min1不等于arr[0],就将min1与arr[0]交换。接着对右边n-1个元素也这样,第二次找到这n-1个元素中的最小值min2,比较min2与arr[1],如果不相等就交换。依此类推,第i次从arr[i-1]到arr[n-1]中找到最小值mini,与arr[i-1]比较,如果不相等就交换;第n-1次从arr[n-2]到arr[n-1]中选最小值minn-1,比较minn-1与arr[n-2],如果不相等就交换。直到整个数组从小到大排列。总共n-1次。

选择排序是从左到右找到位置对应的元素。

2.动态图解

3.举例

比如原始数组为:8,3,2,1,7,4,6,5

第一趟排序:1,3,2,8,7,4,6,5 因为第一次从arr[0]到arr[n-1],最小为1,所以1和arr[0]也就是8交换,1变成arr[0]

第二趟排序:1,2,3,8,7,4,6,5 因为后面7个数中2最小,与arr[1]比较,2比arr[1]小,所以交换,2变成arr[1]

第三趟排序:1,2,3,8,7,4,6,5 因为3是后面6个数中最小的,并且就是arr[2],所以不用交换

第四趟排序:1,2,3,4,7,8,6,5 因为4是后面5个数中最小的,与arr[3]比较,4比arr[3]小,所以交换,4变成arr[3]

第五趟排序:1,2,3,4,5,8,6,7 因为5是后面4个数中最小的,与arr[4]比较,5比arr[4]小,所以交换,5变成arr[4]

第六趟排序:1,2,3,4,5,6,8,7 因为6是后面3个数中最小的,与arr[5]比较,6比arr[5]小,所以交换,6变成arr[5]

第七趟排序:1,2,3,4,5,6,7,8 因为7是后面2个数中最小的,与arr[6]比较,7比arr[6]小,所以交换,7变成arr[6]

4.小结选择排序规则

①数组元素个数为n,就一共进行n-1次大循环

②每一趟排序又是一个循环:

先假定当前这个数是最小值,然后和后面每个数进行比较,如果有比当前数更小的数,就重新确定最小值,并且得到下标。遍历到数组最后就得到本趟的最小值和下标。然后就可以对最小值和应该在的位置的数比较看要不要交换。交换的话就让数组中下标为最小值所在位置的元素的值变成正在排的下标的元素的值。用把元素放在对应位置的想法,比如正在排i这个位置,找i这个位置应该对应的元素,arr[minIndex]=arr[i],这是把原来i位置的元素放到找到最小值的位置。arr[i]=min,这是把min放在正在排的这个位置。

5.选择排序代码

包括推导代码和最终代码

package com.xjj.sort;

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int arr[]={8,3,2,1,7,4,6,5};
        selectSort(arr);
    }
    //选择排序-找过程
    public static void selectSort1(int[] arr){
        //第一轮
        int min=arr[0];
        int minIndex=0;
        //先和第二个数比较
        for(int i=1;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[0],也就是交换
        if(minIndex!=0){
            arr[minIndex]=arr[0];//把原来的arr[0]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[0]=min;//将最小值放在arr[0]
        }
        System.out.println("第一轮:"+Arrays.toString(arr));

        //第二轮
        min=arr[1];
        minIndex=1;
        for(int i=2;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[1],也就是交换
        if(minIndex!=1){
            arr[minIndex]=arr[1];//把原来的arr[1]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[1]=min;//将最小值放在arr[1]
        }
        System.out.println("第二轮:"+Arrays.toString(arr));

        //第三轮
        min=arr[2];
        minIndex=2;
        for(int i=3;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[2],也就是交换
        if(minIndex!=2){
            arr[minIndex]=arr[2];//把原来的arr[0]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[2]=min;//将最小值放在arr[0]
        }
        System.out.println("第三轮:"+Arrays.toString(arr));
        //写了三轮发现和推导时结果一样,不写了
        /*
        第一轮:[1, 3, 2, 8, 7, 4, 6, 5]
        第二轮:[1, 2, 3, 8, 7, 4, 6, 5]
        第三轮:[1, 2, 3, 8, 7, 4, 6, 5]
        */
    }
    //找到规律后就用两层循环写
    public static void selectSort(int[] arr){
        for(int j=0;j<arr.length-1;j++){
            int min=arr[j];
            int minIndex=j;
            for(int i=j+1;i<arr.length;i++){
                if(min>arr[i]){
                    min=arr[i];
                    minIndex=i;
                }
            }
            if(minIndex!=j){ //不相等才交换,也就是不在应该的位置就交换
                arr[minIndex]=arr[j];
                arr[j]=min;
            }
            System.out.println("第"+(j+1)+"轮:"+Arrays.toString(arr));
        }
    }
}

运行结果:

6.运行时间

插入段记录时间的代码。排序前记一次时间,排序后记一次时间。

然后输出元素的代码就先注释掉。

代码:

package com.xjj.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class SelectSort {
    public static void main(String[] args) {
//        int arr[]={8,3,2,1,7,4,6,5};
//        selectSort(arr);
        int arr2[]=new int[80000];
        for(int i=0;i<80000;i++){
            arr2[i]=(int)(Math.random()*80000);
        }
        Date date1=new Date();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str=simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:"+date1Str);
        selectSort(arr2);
        Date date2=new Date();
        String date2Str=simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:"+date2Str);
    }
    //找到规律后就用两层循环写
    public static void selectSort(int[] arr){
        for(int j=0;j<arr.length-1;j++){
            int min=arr[j];
            int minIndex=j;
            for(int i=j+1;i<arr.length;i++){
                if(min>arr[i]){
                    min=arr[i];
                    minIndex=i;
                }
            }
            if(minIndex!=j){//不相等才交换,也就是不在应该的位置就交换
                arr[minIndex]=arr[j];
                arr[j]=min;
            }
//            System.out.println("第"+(j+1)+"轮:"+Arrays.toString(arr));
        }
    }
}

运行结果:

80000个元素,选择排序运行时间2秒。


记住:选择排序是从左到右找到位置对应的元素。


后面会继续写插入排序等排序算法的内容。分类排序部分写完之后再给出一些题目练习^_^加油加油

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值