常见的排序算法可分为以下四种七类:
一、直接插入排序:
将整列需要排序的数字分为有序区间和无序区间,每次从无序区间取出一个数,插入到有序区间里。
【例】
原始序列:3 8 5 2 7
因为单独的一个数字是有序的,所以第一次有序区间只有数字3,无序区间从数字8开始一直到最后;可定义 “ i ” 从下标为1的位置开始遍历。
每次插入排序过程如下:
代码实现:
public static void main(String[] args) {
int[] arr = new int[] {
13,8,5,2,7,0,9,3};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void insertSort(int[] arr) {
//遍历所有的数字,从1开始,因为第一个数字已经是有序的
for (int i = 1; i < arr.length; i++) {
//记录下当前的数字
int tmp = arr[i];
/*
* 定义j从后往前遍历有序区间的数字,
* 若当前数字大于记录下来的数字,则把j号下标位置的数字放到i号下标位置(即j + 1号下标位置),否则结束此次比较
* 循环结束之后,再将所记录下来的tmp的数字放到j + 1号下标位置(循环结束之后,j--了,所以需要放的是j + 1下标位置)
* */
int j = i - 1;
for ( ; j >= 0; j--) {
if (arr[j] > tmp) {
arr[j + 1] = arr[j];
} else {
break;
}
}
arr[j + 1] = tmp;
}
}
二、希尔排序
希尔排序法又称缩小增量法。是对直接插入排序的优化。
希尔排序是将所有待排序的数据分为若干个组,然后对每个组里的数据进行排序;然后重复分组和对组内数据排序,直至最后的分组数据是两个相邻的数据,进行最后一次排序,即可将所有待排序的数据排好。
【例】
待排数据:8 1 2 6 7 4 9 5 3 6
将待排数组的长度除以2,得到的结果再除以2,直到最后值为1;把每次得到的结果记为:d(步长),然后根据步长进行分组、排序。每一次分组后都对组内元素进行排序。
代码实现:
public static void main(String[] args) {
int[] arr = new int[] {
13,8,5,2,7,9,3,22,0};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void shellSort(int[] arr) {
//遍历所有步长
for (int d = arr.length / 2; d > 0; d /= 2) {
//遍历所有的元素
for (int i = d; i < arr.length; i++) {
//遍历每一组里面的所有元素
for<