本文总结常见排序算法的java语言写法,希望加深自己对各个排序算法思路的理解,同时方便初学者阅览。
题目:
1. 冒泡排序
2. 插入排序
3. 选择排序
4. 快速排序
5. 希尔排序
6. 归并排序,递归与迭代
7. 堆排序
几种排序的算法的各种指标对比:
排序算法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | (不)稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(nlogn)~O(n) | 不稳定 |
希尔排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
Arrays.sort()
方法底层对数组进行排序所采用的方法:
1. 基本数据类型数组进行排序采用的是快速排序
2. 对象类型数组采用的是归并排序
辅助方法:
//交换数组中指定的两个元素
public static void swap(int[] arr, int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
1.冒泡排序
/**
* 冒泡排序
* 平均和最坏时间复杂度O(n^2)
* 最好时间复杂度O(n)
* 稳定
*/
public static int[] bubbleSort(int[] arr) {
if(arr.length <= 1)
return arr;
//需要arr.length-1次循环,每一次循环找出当前循环中最大的数
for(int i = 0; i < arr.length-1; i++) {
//每次找到的最大的数沉到最末尾以后不再比较这个数
for(int j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
return arr;
}
2.插入排序
/**
* 插入排序
* 平均和最坏时间复杂度O(n^2)
* 最好时间复杂度O(n)
* 稳定
*/
public