选择排序(经典)

思路分析

基本思想为:

第一次从$arr[0]至arr[n-1]$中选取最小值,与$arr[0]$交换;第二次从$arr[1]至arr[n-1]$中选取最小值,与$arr[1]$交换;第三次从$arr[2]至arr[n-1]$中选取最小值,与$arr[2]$交换……

图解

image-20241031164111535

说明

  1. 选择排序有arr.length-1轮排序
  2. 每一轮循环,都是找出当前待排序元素的最小值(的索引minIndex),放置到最前面(swap(arr[minIndex],arr[i]))。
  3. 时间复杂度为$O(n^2)$

代码实现

算法性能测试

测试数据大小 花费时间(单位:毫秒)
10000 26
50000 592
80000 1470
140000 4337

SelectSort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.yukinoshita.algorithm.sort;

import java.util.Arrays;
import java.util.Random;

public class SelectSort {
public static void main(String args[]) {
int[] arr = {3, 9, -1, 10, -2};

System.out.println("排序前:" + Arrays.toString(arr));
selectSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));

// 测试算法性能
testPerformance();
}

private static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
// 交换位置
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}

// 测试算法性能的方法
private static void testPerformance() {
int size = 80000; // 数组大小
int[] arr = new int[size];
Random random = new Random();

// 生成无序数组
for (int i = 0; i < size; i++) {
arr[i] = random.nextInt(100000); // 随机数范围可以根据需要调整
}

long startTime = System.currentTimeMillis(); // 记录开始时间
selectSort(arr); // 排序
long endTime = System.currentTimeMillis(); // 记录结束时间

System.out.println("排序大小: " + size);
System.out.println("排序时间: " + (endTime - startTime) + " 毫秒");
}
}