折半插入排序
折半插入的原理与普通插入排序完全相同,即在完全排列的子列中寻找插入元素的位置,并将此位置之后直到待排元素前的元素后移一位。区别是:折半插入利用折半查找来提高查找效率。即从中点开始,利用划分的思路进行查找。
时间复杂度:每轮比较的次数k,有最少为1次,至多 k^2 = n 即 k = log2(n), 所以 时间复杂度为 O(n*log2(n))。移动的次数最少为0,最多为n。所以移动的时间复杂度为O(n^2)。综上,最小时间复杂度为O(n), 最大为O(n^2)
class Solution:
def array_binary_insertion_sort(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
for i in range(1,len(nums)):
print(i)
low = 0
high = i - 1
if low == high:
if nums[low] > nums[i]:
nums[low], nums[i] = nums[i], nums[low]
print(nums)
continue
while low <= high:
print(low, high)
mid = (low + high) // 2
if nums[mid] >= nums[i]:
high = mid - 1
else:
low = mid + 1
print(low,mid,high,i)
buff = nums[i]
#print(nums)
nums[high+2:i+1] = nums[high+1:i]
#print(nums)
nums[high+1] = buff
#print(nums)
return(nums)
if __name__ == "__main__":
sol = Solution()
result = sol.array_binary_insertion_sort([3,6,3,87,3,2,8,9,0,1])