选择排序(经典)
思路分析
基本思想为:
第一次从$arr[0]至arr[n-1]$中选取最小值,与$arr[0]$交换;第二次从$arr[1]至arr[n-1]$中选取最小值,与$arr[1]$交换;第三次从$arr[2]至arr[n-1]$中选取最小值,与$arr[2]$交换……
图解:
说明:
- 选择排序有
arr.length-1轮排序
- 每一轮循环,都是找出当前待排序元素的最小值(的索引
minIndex),放置到最前面(swap(arr[minIndex],arr[i]))。
- 时间复杂度为$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) + " 毫秒"); } }
|