插入排序有两种算法:直接插入排序和希尔排序
- 直接插入排序
原理:插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。
该排序算法的外部循环为遍历全部元素,内部循环为遍历当前外部循环记录元素的前面所有数字。
public static void insertSort(int[] arr) {
for(int i = 1;i < arr.length;i++) {
//在保证当前元素之前的数字是有序的情况下
if(arr[i]<arr[i-1]) {
//把当前遍历的数字存起来
int temp = arr[i];
int j;
//遍历当前元素i前面所有的数字
for(j = i-1; j>=0 && temp<arr[j] ;j--) {
//把前一个数字赋给后一个数字
arr[j+1] = arr[j];
}
//arr[j]不满足即temp>arr[j],应当放在arr[j]的后面
//把临时变量(外层for循环的当前元素)赋给不满足条件的后一个元素
arr[j+1] = temp;
}
}
}
- 希尔排序
原理:也被称为“缩小增量排序”,将待排序的数组元素按照步长分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,直到最后步长降为1,再对所有元素进行一次直接插入排序。
该排序算法属于直接插入算法的改进,代码简洁易懂,直接贴。
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(int j=i-d ; j>=0 ; j-=d) {
//如果当前元素大于加上步长后的那个元素
if(arr[j]>arr[j+d]) {
int temp = arr[j];
arr[j] = arr[j+d];
arr[j+d] = temp;
}
}
}
}
}