7种基于比较的排序方法
根据使用频率和重要性归纳总结以下其中常见的排序方法:
1)快速排序、归并排序、冒泡排序
2)插入排序、堆排序
3)选择排序
4)希尔排序
1.冒泡排序
规则:重复地走访要排序的无序区间数列,一次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。实现方式:首先写一段交换元素的子程序,之后通过循环套循环实现
public static void swap(long[] array, int i, int j) {
long t = array[i];
array[i] = array[j];
array[j] = t;
}
public static void bubbleSort(long[] array) {
// 要排好整个数组,一共需要多少次冒泡过程
for (int i = 0; i < array.length - 1; i++) {
// 无序区间:[0, array.length - i) 元素个数 array.length - i
boolean sorted = true;
// 无序区间的相邻的两个元素,需要两两比较一次
for (int j = 0; j < array.length - i - 1; j++) {
// 永远保证,相邻两个元素,最大的在后边
if (array[j] > array[j + 1]) { // 不加等号,具备稳定性
Swap.swap(array, j, j + 1);
sorted = false;
}
}
if (sorted) {
return;
}
}
}
2.选择排序
规则:每一次从待排序的数据元素中选出最大的一个元素,存放在无序区间最后一个元素的位置,直到全部待排序的数据元素排完。
public static void selectSort(long[] array) {
// 要排好整个数组,一共需要多少次选择过程
for (int i = 0; i < array.length - 1; i++) {
// 无序区间:[0, array.length - i) 元素个数 array.length - i
// 内部的循环整体,遍历无序区间,找到最大的元素的过程 => 最大元素所在的下标
int maxElementIdx = -1;
for (int j = 0; j < array.length - i; j++) {
if (maxElementIdx == -1 || array[j] > array[maxElementIdx]) {
maxElementIdx = j;
}
}
// 交换,最大的元素 和 无序区间最后一个元素的位置
Swap.swap(a