选择排序不管在什么样的情况下(即使是已经排好序的序列),都需要进行 n 2 / 2 n^2/2 n2/2次比较操作和 n n n次交换操作,因此它的时间复杂度为O( n 2 n^2 n2)
代码:
/** * 选择排序(从小到大) * 从数组中选择最小的元素,与数组中第一个元素交换位置。 * 再从数组剩下的元素中选择最小的元素,与第二个元素交换位置。 * 不断地进行这样的操作,直到整个数组排序结束。 * * @Author Nino 2019/10/2 */ import java.util.Arrays; import java.util.Random; public class SelectionSort<E extends Comparable<E>> { public void sort(E[] arr) { int n = arr.length; for (int i = 0; i < arr.length; i++) { int minIndex = i; //寻找[i, n)之间的最小值 for (int j = i + 1; j < n; j++) { if (arr[j].compareTo(arr[minIndex]) < 0) { minIndex = j; } } swap(arr, i, minIndex); } } /** * 交换数组nums中i,j索引的值 * @param nums * @param i * @param j */ private void swap(E[] nums, int i, int j) { E temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } /** * 测试用例 * @param args */ public static void main(String[] args) { Random random = new Random(); Integer[] arr = new Integer[10]; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.valueOf(random.nextInt(20)); } System.out.println(Arrays.asList(arr).toString()); new SelectionSort<Integer>().sort(arr); System.out.println(Arrays.asList(arr).toString()); } }结果:
[11, 15, 0, 12, 3, 13, 14, 1, 0, 12] [0, 0, 1, 3, 11, 12, 12, 13, 14, 15]