排序算法概述:
排序算法大致可以分为两大类:内部排序算法(在内存中进行的算法,也就是我下面讲的这十种排序算法)、外部排序算法(数据量很大时无法全部拷贝到内存中时就需要用到外存,称为外部排序算法)
十大经典排序算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | In-place | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | In-place | 不稳定 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | In-place | 稳定 |
希尔排序 | O(n1.3) | O(n) | O(n2) | O(1) | In-place | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | Out-place | 稳定 |
快速排序 | O(nlog2n) | O(nlog2n) | O(n2) | O(log2n) | In-place | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | In-place | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | Out-place | 稳定 |
桶排序 | O(n+k) | O(n+k) | O(n2) | O(n+k) | Out-place | 稳定 |
基数排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | Out-place | 稳定 |
- n:数据规模
- k:"桶"的个数
- In-place:占用常数内存,不占用额外内存
- Out-place:占用额外内存
- 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同
冒泡排序
1、算法步骤:
(1)、比较开头的两个元素。如果第一个比第二个大,就交换他们两个。
(2)、第二个元素和第三个元素作比较,大的放在后面,以此类推。(这一步做完最大的会放在后面最)
(3)、针对所有元素再来一遍以上操作(除了最后一个)
(4)、随着每轮比较次数越来越少,直到最后没有数字需要比较
2、最好情况:输入的数据就是正序,一次都不用动
3、最坏情况:倒叙,每次都得换
4、Java代码实现
public class BubbleSort {
public static void bubbleSort(int[] arr) {
//数组长度
int len = arr.length;
//遍历数组
for (int i = 0; i < len - 1; i++) {
boolean flag = true;
for (int j = 0; j < len - i - 1; j++) {
//如果前面的大,交换位置
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = false;
}
}
if (flag) {
break;//退出循环
}
}
}
}
选择排序
1、算法步骤:
(1)、在未经过排序的数组中找到最小的元素,把它放在首位
(2)、在未经过排序的数组中找到最小的元素,把它放在第二个索引位置
(3)、重复以上操作,直到比较完毕
2、Java代码实现
public class SelectionSort {
public static void selectionSort(int[] arr) {
int len = arr.length;
for (int i = 0; i < len - 1; i++) {
int minVal = i;
for (int j = i + 1; j < len; j++) {
if (arr[minVal] > arr[j]) {
minVal = j;
}
}
if (minVal != i) {
int tmp = arr[i];
arr[i] = arr[minVal];
arr[minVal] = tmp;
}
}
}
}
持续更新中,未完待续……