一、插入排序
1.直接插入排序
1.1 算法思想:
每次从待排序的数列中按顺序拿出一个数,在已经排好序的有序序列中比对其大小,插入到对应位置,形成一个新的有序序列,全部插入完毕后形成的有序序列就是排好序的序列。
1.2 算法图示:
1.3 特性总结:
1. 元素集合越有序,时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:稳定
1.4代码实现:
public static void insertSort(int[] array){
for(int i=0,len = array.length; i<len; i++){
int temp = array[i];//待插入的数据
int j=i-1;
for(; j>=0 && array[j] > temp;j--){
array[j+1] = array[j];//后移为带插入的数据挪出位置
}
array[j+1] = temp;//放入数据
}
}
2.希尔排序(缩小增量排序)
2.1算法思想:
将整个无序列分割成若干小的子序列分别进行插入排序的一种方法,是直接插入排序算法的一种更高效的改进版。
先选定一个增量gap,把待排序文件中所有距离为gap的记录分在同一组内,并对每一组内的记录进行插入排序。然后将增量减少,重复上述分组和排序的工作。当增量减少到1时,整个文件恰被分成一组,算法便终止 。
2.2 算法图示:
2.3 特性总结:
1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序,这样直接插入排序就会很快。
3. 希尔排序的平均时间复杂度: O(N^1.3—N^2)
4. 稳定性:不稳定
2.4代码实现:
public static void shellSort(int[] array){
int[] drr = {5,3,1};//增量
for(int i=0,len = drr.length; i<len; i++){
shellHelper(array, drr[i]);//进行直接插入排序
}
}
private static void shellHelper(int[] array, int gap){
for(int i=gap,len = array.length; i<len ;i++){
int temp = array[i];//待插入数据
int j=i-gap;
for(; j>=0 && array[j] > temp; j-=gap){
ar