数据结构 - 折半插入排序

折半插入排序

折半插入的原理与普通插入排序完全相同,即在完全排列的子列中寻找插入元素的位置,并将此位置之后直到待排元素前的元素后移一位。区别是:折半插入利用折半查找来提高查找效率。即从中点开始,利用划分的思路进行查找。

时间复杂度:每轮比较的次数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])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值