选择排序
实现原理
首先从未排序序列中找到最小的元素,放置到排序序列的起始位置,然后从剩余的未排序序列中继续寻找最小元素,放置到已排序序列的末尾。所以称之为选择排序。
代码实现
public static int[] selectionSort(int[] arr){ if (null == arr || arr.length == 0){ return null; } int length = arr.length; for (int i = 0; i < length - 1; i++) { int min = i; for (int j = i + 1; j < length; j++) { if (arr[j] < arr[min]){ min = j; } } int temp = arr[i]; arr[i] = arr[min]; arr[min] = temp; } return arr; }
案例分析
时间复杂度与空间复杂度
每次要找一遍最小值,最坏情况下找n次,这样的过程要执行n次,所以时间复杂度还是O(n^2)。空间复杂度是O(1)。
快速排序
实现原理
-
在数据集之中,选择一个元素作为”基准”(pivot)。
-
所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition)。
操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
-
对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
代码实现
public static int partition(int[] array, int lo, int hi) { // 固定的切分方式 int key = array[lo]; while (lo < hi) { while (array[hi] >= key && hi > lo) {// 从后半部分向前扫描 hi--; } array[lo] = array[hi]; while (array[lo] <= key && hi > lo) {// 从前半部分向后扫描 lo++; } array[hi] = array[lo]; } array[hi] = key; return hi; } public static int[] sort(int[] array, int lo, int hi) { if (lo >= hi) { return array; } int index = partition(array, lo, hi); sort(array, lo, index - 1); sort(array, index + 1, hi); return array; }