最简单的排序——选择排序
适用场景:
选择排序是排序中比较简单的,对于初学者来说,比较方便理解,是开始学习排序的不二之选,但是它的时间复杂度是最糟糕的;其时间复杂度为o(N2)。
算法思想:
首先,从数组中找到一个最小的元素,将它和第一个元素交换位置;然后从剩下的元素中找到一个最小的元素将它和第二个交换位置;如此往复,直到所有元素都已经为有序即可。
特点:
运行时间和输入无关:
不管输入的是否有序,选择排序不会跳过,每一个数据都会做对比,也就是说:有序和逆序的运算时间是一样多的。
数据移动是最少的:
每轮只会交换两个数据,故选择排序用了N次交换,它的交换是和数据量是一种线性的关系。
代码实现:
/* * 排序算法之选择排序 每次选择一个最小的数和当前的未排序的数交换位置,直到最后一个 */ // 一个排序的标准模板: public void sort(double[] a) { for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (less(a[j], a[i])) exch(a, i, j); } } } // 比较两个数组 private static boolean less(double a, double a2) { // 如果第一个数小于第二个数就会返回true return a - a2 <= 0; } // 交换数组中的两个数 private void exch(double[] a, int i, int j) { double t = a[i]; a[i] = a[j]; a[j] = t; } // 显示数组 private void show(double[] a) { for (int i = 0; i < a.length; i++) { StdOut.print(a[i] + "\t"); } } // 判断数组是否是有序的 public static boolean isSort(int[] a) { for (int i = 0; i < a.length - 1; i++) { if (a[i] > a[i + 1]) return true; } return false; } }