o(n^2) 的排序算法。性能那么差,为什么还要学习?
首先,它是基础,千里之行,始于足下。它编码简单,容易实现,是一些简单情景的首选,它能给我们的问题一个暴力的解法,这样的解法也许不是最优的,但是它能给我们想出其他的优化算法一些启发,思路。
一、选择排序
选择排序是在给定的数据集合中,找出最小的值放在前面,依次类推,直到所有的元素都排序完成。
代码实现:
1 public static void selectionSorted(int arr[] 2 3 int n = arr.length; 4 for (int i = 0; i < n; i++) { 5 // 在[i...n] 闭区间中寻找最小值 6 int minIndex = i; 7 for (int j = i + 1; j < n; j++) { 8 if (arr[j] < arr[i]) { 9 minIndex = j; 10 } 11 SortedHandler.swap(arr, minIndex, i); 12 } 13 } 14 }
二、插入排序
基本操作的插入排序 (其实这样性能是低于选择排序的)
public static void insertSorted(int[] arr) { int n = arr.length; // 从数组的第二个元素开始循环数组 for (int i = 1; i < n; i++) { // 将第 i 个元素插入到 [0...j-1] 闭区间中的合适位置, // 这里的 j 不用等于 0 ,说明j的最后一个比较的元素是 该数组的 下标为0 的元素 for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) SortedHandler.swap(arr, j, j - 1); else break; } // 第二层循环的第二种写法, // 如果 arr[j] < arr[j-1] 的话,退出本次的内层循环, // 从这里也可以看出插入排序的性能其实是由于选择排序的,尽管它们的时间复杂度都是 O(n) // for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) { // SortedHandler.swap(arr, j, j - 1); // } } }
改进版本的插入排序(性能高于选择排序)
对于近乎有序的数组,它的表现可能更高于O(logn)级别的算法。
public static void insertSorted(int[] arr) { int n = arr.length; for (int i = 1; i < n; i++) { int tmp = arr[i]; int j; // tmp元素应该存放的位置 for (j = i; j > 0 && arr[j - 1] > tmp; j--) { arr[j] = arr[j - 1]; } arr[j] = tmp; } }
三、 冒泡排序
public void bubbleSorted (int arr [] ) { int n = arr.length; for ( int i =0; i < n -1; i++ ) { for ( int j =0; j < n -1 -i; j++) { if ( arr[ j ] > arr[ j+1 ]){
SortedHandler.swap(arr, j, j + 1);
}
}
}
}