前言
排序算法有很多,这里列出最常用的一些,如选择排序、插入、冒泡等。
稳定性:待排序数据中有相同的数,排序之后相同的数与排序前的前后位置关系不变,则成为稳定排序算法。
比如我们有一组数据2,9,3,4,8,3;按照大小排序之后就是2,3,3,4,8,9;两个3的前后顺序在排序前后保持不变,即稳定。
一、选择排序
最佳时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 稳定性 | 空间复杂度 |
---|---|---|---|---|
O(N^2) | O(N^2) | O(N^2) | 不稳定 | O(1) |
代码:
public void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (min != i) {
swap(arr, i, min);
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
二、插入排序
最佳时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 稳定性 | 空间复杂度 |
---|---|---|---|---|
O(N) | O(N^2) | O(N^2) | 稳定 | O(1) |
代码:
public void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int insertNote = arr[i];
int j = i - 1;//前一个元素的下标
while (j >= 0 && insertNote < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = insertNote;
}
}
三、冒泡排序
最佳时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 稳定性 | 空间复杂度 |
---|---|---|---|---|
O(N) | O(N^2) | O(N^2) | 稳定 | O(1) |
代码:
public void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {