冒泡排序
思想:循环n次,交换左右两侧数据
时间复杂度:
平均:O(N^2)
最好:O(N)
平均:O(N^2)
空间复杂度:O(1)
稳定性:稳定排序
代码实现:
// 左右两侧比较
public static void bubbleSort(int[] array) {
for (int i = 0; i < array.length - 1; ++i) {
for (int j = 0; j < array.length - i - 1; ++j) {
if (array[j] > array[j + 1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
// 优化
public static void bubbleSort2(int[] array) {
for (int i = 0; i < array.length - 1; ++i) {
boolean flag = true;
for (int j = 0; j < array.length - i - 1; ++j) {
if (array[j] > array[j + 1]) {
flag = false;
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
if (flag) {
break;// 排序序列本身已有序
}
}
}
快速排序
思想:
1、找一个基准值(关键数)
方法1:排序序列中最左/右的数(一般用此方法)
方法2:随机取值
方法3:三数取中法
2、让整个数组中比基准值小的值放于基准值左侧,反之放于基准值右侧
方法1:左右下标法
方法2:挖坑法
方法3:前后下标法
3、将数组分成3部分:左、基准值、右
4、分而治之(子问题的思想)
时间复杂度:
平均:O(NlgN)
最好:O(NlgN)
最坏:O(N^2)//排序序列是逆序的
空间复杂度:O(NlgN);递归时,O(N)
稳定性:不稳定排序
代码实现: