数据结构之选择排序

一、基本思路
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素依规定交换位置后达到排序的目的

依次选最小值排放
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、代码
原始:

package com.ws.排序.选择排序;

import java.util.Arrays;
//时间复杂度(n*2)
//原始
public class SelectSort {
    public static void main(String[] args) {
        int[] arr={9,5,6,3};
        System.out.println("##########排序前#########");
        System.out.println(Arrays.toString(arr));
        System.out.println("##########排序后#########");
        pai(arr);
    }

    //选择排序
    public static void pai(int[] arr){
        //先简单后复杂,把复杂的算法拆分成一个个问题后逐步解决

        int minIndex=0;//用于交换
        for (int i=0;i<arr.length-1;i++) {//第几个数
            //每一次的排序
            for (int j = i; j < arr.length; j++) {
                if (arr[i]>arr[j]){//如果后面有比前面的小的,就交换顺序
                    minIndex=arr[i];
                    arr[i]=arr[j];
                    arr[j]=minIndex;
                }
            }
            System.out.println("第"+(i+1)+"次排序="+ Arrays.toString(arr));
        }
        System.out.println("排序后="+Arrays.toString(arr));

    }
}

##########排序前#########
[9, 5, 6, 3]
##########排序后#########
第1次排序=[3, 9, 6, 5]2次排序=[3, 5, 9, 6]3次排序=[3, 5, 6, 9]4次排序=[3, 5, 6, 9]
排序后=[3, 5, 6, 9]

进程已结束,退出代码0


优化:

package com.ws.排序.选择排序;

import java.util.Arrays;

//时间复杂度(n*2)
//优化
//由于交换数只交换一次,所以效率高,原先是每次交换数,在这里是交换角标
public class SelectSortto {
    public static void main(String[] args) {
        int[] arr={9,5,6,3};
        System.out.println("##########排序前#########");
        System.out.println(Arrays.toString(arr));
        System.out.println("##########排序后#########");
        pai(arr);
    }

    //选择排序
    public static void pai(int[] arr){
        //先简单后复杂,把复杂的算法拆分成一个个问题后逐步解决

        for (int i = 0; i < arr.length - 1; i++) {
            //默认当前位置最小
            int min = arr[i];//最小的数
            int minIndex = i;//最小的角标
            // 遍历,找到最小的数
            for (int j = i + 1; j < arr.length; j++) {//和后面的数比较
                if (min > arr[j]) { // 说明min不是真的最小值
                    min = arr[j]; // 重置min
                    minIndex = j; // 重置minIndex
                }
            }
            // 判断是否需要交换
            //将最小的数放到当前排序的最前面
            if (minIndex != i) {//角标是否交换过
                //交换数
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
            System.out.println("第"+(i+1)+"次排序="+ Arrays.toString(arr));
        }
        System.out.println("排序后="+Arrays.toString(arr));

}
}
##########排序前#########
[3, 5, 6, 9]
##########排序后#########
第1次排序=[3, 5, 6, 9]2次排序=[3, 5, 6, 9]3次排序=[3, 5, 6, 9]
排序后=[3, 5, 6, 9]

进程已结束,退出代码0

大数据测试:

package com.ws.排序.选择排序;

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

//时间复杂度(n*2)
public class SelectSorts {
    public static void main(String[] args) {
        System.out.println("########大数据排序80000########");
        int[] a=new int[80000];
        for (int i=0;i<80000;i++){
            a[i]=(int)(Math.random()*8000000);
        }
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String data=format.format(date);
        System.out.println("排序前时间="+data);
        //排序
        pai(a);
        Date date1=new Date();
        String data2=format.format(date1);
        System.out.println("排序后的时间="+data2);
    }

    //选择排序
    public static void pai(int[] arr){
        //先简单后复杂,把复杂的算法拆分成一个个问题后逐步解决

        for (int i = 0; i < arr.length - 1; i++) {
            //默认当前位置最小
            int min = arr[i];//最小的数
            int minIndex = i;//最小的角标
            // 遍历,找到最小的数
            for (int j = i + 1; j < arr.length; j++) {//和后面的数比较
                if (min > arr[j]) { // 说明min不是真的最小值
                    min = arr[j]; // 重置min
                    minIndex = j; // 重置minIndex
                }
            }
            // 判断是否需要交换
            //将最小的数放到当前排序的最前面
            if (minIndex != i) {//角标是否交换过
                //交换数
                arr[minIndex] = arr[i];
                arr[i] = min;
            }

        }


    }
}
########大数据排序80000########
排序前时间=2021-02-07 18:48:49
排序后的时间=2021-02-07 18:48:52
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值