选择排序(Java)
1.概念
2.基本思想
3.思路图解
原始数组:101,34,119,1
第一轮排序:
第二轮排序:
第三轮排序:
说明:
实例:原始数组:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
4.代码
4.1分析代码
package DataStructures.Sort;
import java.util.Arrays;
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1};
System.out.println("排序前:" + Arrays.toString(arr));
selectionSort(arr);
}
/**
* @param arr
* @author ZJ
* Description 选择排序
* date 2022-05-06 11:55:52 11:55
*/
public static void selectionSort(int[] arr) {
int minIndex = 0;
int min = arr[0];
//第一轮
for (int j = 0 + 1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];//重置最小值
minIndex = j;//重置最小值下标
}
}
//将最小值放在arr[0],即交换
arr[minIndex] = arr[0];
arr[0] = min;
System.out.println("第一轮后:" + Arrays.toString(arr));
//第二轮
minIndex = 1;
min = arr[1];
for (int j = 1 + 1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];//重置最小值
minIndex = j;//重置最小值下标
}
}
//将最小值放在arr[1],即交换
arr[minIndex] = arr[1];
arr[1] = min;
System.out.println("第二轮后:" + Arrays.toString(arr));
//第三轮
minIndex = 2;
min = arr[2];
for (int j = 2 + 1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];//重置最小值
minIndex = j;//重置最小值下标
}
}
//将最小值放在arr[2],即交换
arr[minIndex] = arr[2];
arr[2] = min;
System.out.println("第三轮后:" + Arrays.toString(arr));
}
}
4.2优化代码
package DataStructures.Sort;
import java.util.Arrays;
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1};
System.out.println("排序前:" + Arrays.toString(arr));
selectionSort(arr);
}
/**
* @param arr
* @author ZJ
* Description 选择排序
* date 2022-05-06 11:55:52 11:55
*/
public static void selectionSort(int[] arr) {
int minIndex;
int min;
for (int i = 0; i < arr.length - 1; i++) {
minIndex = i;
min = arr[i];
for (int j = i + 1; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];//重置最小值
minIndex = j;//重置最小值下标
}
}
if (minIndex != i) {//减少不必要的交换
arr[minIndex] = arr[i];
arr[i] = min;
}
System.out.printf("第%d轮后:", i + 1);
System.out.println(Arrays.toString(arr));
}
}
}
时间复杂度O(n²)
5.八万数据测试
public static void main(String[] args) {
// int[] arr = {101, 34, 119, 1};
// System.out.println("排序前:" + Arrays.toString(arr));
// selectionSort(arr);
//80000数据测试
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);
selectionSort(arr);
Date date2 = new Date();
String date2Str = simpleDateFormat.format(date2);
System.out.println("排序后时间是" + date2Str);
}