开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情
二、选择排序 (Select Sorting)
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一 元素,再依规定交换位置后达到排序的目的。
思路
第 一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从 arr[1] ~ arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~ arr[n-1]中 选取最小值,与arr[2]交换,…,第i次从arr[i-1] ~ arr[n-1]中选取最小值, 与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2] 交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
分析
原始数组 : 101,34,119,1,要求:由小到大
每次执行的得到的结果:
- 1,34,119,101
- 1,34,119,101
- 1,34,101,119
结论
-
需要执行数组大小 -1轮排序
-
每一轮都是一个循环,循环的规则(代码)
- 先假定当前数为最小数,
- 然后和后面的数进行比较,若当前数更小,重新得到最小数,并得到下标
- 遍历到数组的最后时,就得到本轮的最小数和下标
- 交换
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
/**
* @author Kcs 2022/9/2
*/
public class SelectSorting {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1};
System.out.println("排序前:" + Arrays.toString(arr));
selectSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
//测试时间
int[] test = new int[8000];
for (int i = 0; i < 8000; i++) {
test[i] = (int) (Math.random() * 80000);
}
Date beforeDate = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatBefore = simpleDateFormat.format(beforeDate);
System.out.println("排序前时间" + formatBefore);
selectSort(test);
Date afterDate = new Date();
String afterDateformat = simpleDateFormat.format(afterDate);
System.out.println("排序前时间" + afterDateformat);
}
/**
* 选择排序
* 时间复杂度 O(n^2)
* @param arr
*/
public static void selectSort(int[] arr) {
//原始数组 : 101,34,119,1,要求:由小到大
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];
// 得到最小值索引
minIndex = j;
}
}
//最小值放在arr[0]
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = min;
}
// System.out.println("第" + (i + 1) + "轮排序结果:" + Arrays.toString(arr));
}
}
}