插入排序顾名思义,插入的方式进行排序;从数列第二个数字开始向前插入,每次都将当前元素插入到左侧之中。时间复杂度,空间复杂度。
可以利用二分查找左侧的有序数组,寻找合适的插入位,减少比较次数。
cpp:
#include <iostream>
#include <vector>
using namespace std;
int BinarySearch(vector<int> &nums, int end, int value)
{
//二分查找插入位
int left = 0;
int right = end - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (nums[mid] < value)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return left;
}
void Binaryinsertsort(vector<int> &nums)
{
for (int i = 1; i < nums.size(); i++)
{
// cout << "The " << i << " :" << endl;
// for (int k = 0; k < nums.size(); k++)
// {
// cout << nums[k] << " ";
// }
// cout << endl;
int temp = nums[i];
int j = i - 1;
//二分查找插入位
int insert_index = BinarySearch(nums, i, nums[i]);
while (j >= insert_index)
{
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = temp;
}
}
void insertsort(vector<int> &nums)
{
for (int i = 1; i < nums.size(); i++)
{
// cout << "The " << i << " :" << endl;
// for (int k = 0; k < nums.size(); k++)
// {
// cout << nums[k] << " ";
// }
// cout << endl;
int temp = nums[i];
int j = i - 1;
for (j; j >= 0 && nums[j] > temp; j--)
{
nums[j + 1] = nums[j];
}
nums[j + 1] = temp;
}
}
int main()
{
vector<int> nums = {23, 4, 54, 45, 53, 45, 98, 84, 98, 36, 47, 9, 0, 23};
cout << "The nums:" << endl;
for (int i = 0; i < nums.size(); i++)
{
cout << nums[i] << " ";
}
cout << endl;
insertsort(nums);
cout << "After sorting:" << endl;
for (int i = 0; i < nums.size(); i++)
{
cout << nums[i] << " ";
}
cout << endl;
// 二分法
vector<int> nums_B = {23, 4, 54, 45, 53, 45, 98, 84, 98, 36, 47, 9, 0, 23};
cout << "The nums:" << endl;
for (int i = 0; i < nums_B.size(); i++)
{
cout << nums_B[i] << " ";
}
cout << endl;
Binaryinsertsort(nums_B);
cout << "After sorting:" << endl;
for (int i = 0; i < nums_B.size(); i++)
{
cout << nums_B[i] << " ";
}
cout << endl;
system("pause");
}
python:
import numpy
def BinarySearch(nums:list[int],start, end , value) -> int:
while start <= end:
mid = (start + end)//2
if nums[mid] < value:
start = start + 1
else:
end = end - 1
return start
def insertsort(nums):
for i in range(1,len(nums)):
temp = nums[i]
j = i - 1
insert_index = BinarySearch(nums,0, i - 1, nums[i])
print(insert_index)
print(nums)
while j >= insert_index:
nums[j + 1] = nums[j]
j -= 1
nums[j + 1] = temp
return nums
if __name__ == "__main__":
nums = numpy.random.randint(0,100,10)
print(nums)
ans = insertsort(nums)
print(ans)