选择排序法
- 选择排序(Selection Sort)是一种原地排序算法(不需要额外的存储空间)。选择排序的每一轮排序都会从待排序列中找到一个最大值(或最小值),而第一轮会将最大值(或最小值)的存放位置交换到序列的起始位置,后续的次大值(或次小值)则会存放到已排序的序列的末尾。
- 图解选择排序过程
选择排序的实现过程
(1)N个数字要排序完成,总共进行N-1轮排序;
(2)每一轮排序,又是一个循环;
(2-1)先假定当前这个数是最小数
(2-2)然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到小标;
(2-3)当遍历得到数组的最后时,就得到本轮的最小数和下标;
(2-4)交换最小数的存放位置 - 选择排序应用实例
package com.atCodeSun.sort08;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
/**
* @author codeSun
* @create 2021-08-10 9:04
*/
//选择排序
public class SelectSort {
public static void main(String[] args) {
// int [] arr = {101,34,119,1};
int[] arr = new int[80000];
for(int i = 0; i < 80000; i++){
arr[i] = (int)(Math.random() * 8000000); //生成[0,8000000)的随机数
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1str = simpleDateFormat.format(date1);
System.out.println("排序前的时间是" + date1str);
// System.out.println("排序前~");
// System.out.println(Arrays.toString(arr));
selectSort(arr);
// System.out.println("排序后~");
// System.out.println(Arrays.toString(arr));
Date date2 = new Date();
String date2str = simpleDateFormat.format(date2);
System.out.println("排序后的时间是" + date2str);
}
public static void selectSort(int[] arr){
//② 整合,使用for循环实现
//选择排序时间复杂度O(n^2)
for (int i = 0; i < arr.length - 1; i++){
int minIndex = i;
int min = arr[i];
for (int j = i + 1; j < arr.length; j++){
if(min > arr[j]){ //说明假定的最小值并不是最小
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//将最小值交换位置
if(minIndex != i){
arr[minIndex] = arr[i];
arr[i] = min;
}
}
/*
//① 分解步骤找出规律
//原始的数组:101,34,119,1 从小到大排列
//第一轮排序:1,34,119,101
int minIndex = 0;
int min = arr[0];
for (int j = 0 + 1; j < arr.length; j++){
if(min > arr[j]){ //说明假定的最小值并不是最小
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//将最小值交换位置
if(minIndex != 0){
arr[minIndex] = arr[0];
arr[0] = min;
}
System.out.println("第一轮后~");
System.out.println(Arrays.toString(arr)); //[1, 34, 119, 101]
//第二轮
minIndex = 1;
min = arr[1];
for (int j = 1 + 1; j < arr.length; j++){
if(min > arr[j]){ //说明假定的最小值并不是最小
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//将最小值交换位置
if (minIndex != 1){
arr[minIndex] = arr[1];
arr[1] = min;
}
System.out.println("第二轮后~");
System.out.println(Arrays.toString(arr)); //[1, 34, 119, 101]
//第三轮
minIndex = 2;
min = arr[2];
for (int j = 2 + 1; j < arr.length; j++){
if(min > arr[j]){ //说明假定的最小值并不是最小
min = arr[j]; //重置min
minIndex = j; //重置minIndex
}
}
//将最小值交换位置
if (minIndex != 2){
arr[minIndex] = arr[2];
arr[2] = min;
}
System.out.println("第三轮后~");
System.out.println(Arrays.toString(arr)); //[1, 34, 101, 119]
*/
}
}