打过扑克牌的人对插入排序的过程和原理应该会很熟悉,插入排序的整个过程就像是不停对手牌理牌,直到手中的手牌全部是有序的.
1.算法原理
将整个数组分为有序区间[0,i)和无序区间[i,length-1]两个部分,每次选择无序区间的第一个元素,插入到有序区间中的合适位置.重复此过程,直到整个数组有序.
2.图像演示
(图像来自runoob)
3.代码实现
public class SevenSort {
public static void insertionSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
//待排序区间第一个元素arr[i]
for (int j = i; j >0; j--) {
if(arr[j] > arr[j-1]){
break;
}else{
swap(arr,j,j-1);
}
}
}
}
private static void swap(int[] arr, int j, int i) {
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
插入排序的优化
在插入排序中,每次都是在有序区间中选择插入位置,因此我们可以使用二分查找来定位元素的位置.
public class SevenSort {
public static void insertionSortBS(int[] arr){
for (int i = 1; i < arr.length; i++) {
int val = arr[i];
int left = 0;
int right = i;
while(left<right){
int mid = (left) + ((right-left)>>1);
if(val<arr[mid]){
right = mid;
}else {
left = mid+1;
}
}
//插入完 元素右移
for (int j = i; j > left ; j--) {
arr[j] = arr[j-1];
}
arr[left] = val;
}
}
}