一、基本思路
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的
依次选最小值排放
二、代码
原始:
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