由於插入排序要在前面的已排序的數組中查找一個位置插入,所以可以用二分法優化查找過程,然後後移元素,插入即可
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];
}