冒泡排序和快速排序的思想是交换,而归并排序的思想是分治。先介绍交换类的排序。
交换类的排序,少不了交换。根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
冒泡排序
这里直接贴上冒泡排序的优化过的代码。
//优化的冒泡排序
public void bubbleSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
boolean flg = false;
for (int j = 0; j < array.length - 1 - j; j++) {
if (array[j] > array[j + 1]) {
swap(array, i, j);
}
}
if (!flg) {
break;
}
}
}
private void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
冒泡排序的特性总结
(1)冒泡排序是一种非常容易理解的排序
(2)时间复杂度:O(N^2)
(3)空间复杂度:O(1)
(4)稳定性:稳定
快速排序(递归)
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
这里介绍经过优化的快速排序。快速排序的过程和二叉树的前序遍历非常像,可以在写代码前想一想二叉树前序遍历经过。整个的过程中,先找到划分的基准,然后分成左右两颗子树,进行排序操作。划分的基准分为Hoare法,挖坑法,前后指针法等。这里介绍较为简单的挖坑法。
所谓挖坑法就是以0下标为基准,然后low和high靠近。以左边下标为基准,需要high先走。其中,high遇到比基准小的,就把low对应下标元素赋值给high,这时候开始走low,low遇到比基准大的,就把high下标元素赋值给lo