由于插入排序要在前面的已排序的数组中查找一个位置插入,所以可以用二分法优化查找过程,然后后移元素,插入即可
public static void insertSort(int [] a)
{
int N = a.length;
for(int i = 1; i < N; i++) // 将第一个元素当做已排序,所有i从1开始
{
int target = a[i]; // 记录要进行排序的元素
int index = findPositionToReplace(a,0,i - 1,target); // 在已经有序的数组中进行
// 二分查找,寻找一个合适的位置插入
backMove(a,index,i); // 将该位置后面的元素后移以腾出一个位置
a[index] = target; // 插入该元素
}
}
public static findPositionToReplace(int [] a,int start,int end) // 二分查找
{
while(start <= end)
{
int mid = start + (end - start) / 2; // 防止下标相加起来越界
if(a[mid] == target)
return mid;
else if(a[mid] > target)
end = mid - 1;
else
start = mid + 1;
}
return start;
}
public static void backMove(int [] a,int start, int end) // 元素后移
{
for(int i = end; i > start; i--)
a[i] = a[i - 1];
}