插入排序(Insertion sort)
- 概述
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。
实现
void insertion_sort(int arr[], int len)
{
int i, j;
for(i = 1; i < len; i++)
{
int key = arr[i]; //保留防止被覆盖
for(j = i -1; j >= 0 && arr[j] > key; j--) //如果左边的比key大,往后挪一个。否则,后面位置放key,即跳出循环arr[j+1] = key
{
arr[j+1] = arr[j];
}
arr[j + 1] = key; //key放到左边有序位置
}
}
利用二分查找优化
实现
int binary_search(vector<int> list, int len, int key)
{
int left = 0;
int right = len - 1; //范围闭区间[left,right]
while(left <= right)
{
int mid = left + ((left + right) >> 1);
if(list[mid] >key) //找最后一个比key大的下标
{
right = mid - 1;
}
else
{
left = mid + 1; //left即要找的比key大的最后一个数的下标
}
}
return (left < n) ? left : -1 //没找到返回-1
}
vector<int> insertion_sort(vector<int> list)
{
vector<int> ret = list;
for(int i = 1; i < ret.size(); i++ )
{
int insert_index = binary_search(ret, i, ret[i])
int temp = ret[i]
for(int j = i - 1; j >= insert_index; j--) //利用binary_search找出的下标缩短循环次数
{
ret[j+1] = ret[j];
}
ret[j + 1] = temp;
}
return ret;
}