数据结构之内部排序--折半插入排序
2018-03-18 12:57
288 查看
概要
-IDE:Pycharm-Python版本:python3.x
-算法分类:内部排序->插入类排序->折半插入排序
算法思想
对于有序表进行折半查找,其性能优于顺序查找。所以,可以将折半查找的思想用于在有序记录r[1,2,3,...,i−1]r[1,2,3,...,i−1]中确定插入位置,相应的排序算法称为折半插入排序。
例如:序列rr长度为nn,前i项有序,待排的记录为r[i+1]r[i+1]。此时低位为r[1]r[1],高位为r[i−1]r[i−1],
查找r[j]r[j],j=(i+1)/2j=(i+1)/2。 若r[j]>r[i+1]r[j]>r[i+1],此时证明那个,待排记录,在1−j1−j之间的位置。高位变为r[j−1]r[j−1],若小于则相反,以此类推,找到合适的位置。
最后则是将记录向后移一位。将待插入的值放入合适的位置。
算法分析
采用折半插入排序,可以减少关键字的比较次数。每插入一次元素,需要比较的次数最大是折半判定树的深度。如插入第ii个元素时设i=2ji=2j,则需要进行log2ilog2i次比较,因此插入n−1n−1个元素平均关键字比较次数nlog2nnlog2n。折半插入改变了元素的比较次数,但是没有改变元素的移动耗费时间。所以其时间复杂度仍为O(n2)O(n2)。稳定性与时间复杂度
排序算法 | 稳定性 | 时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|---|---|
折半插入 | 稳定 | O(n2)O(n2) | O(nlogn)O(nlogn) | O(n2)O(n2) | O(1)O(1) |
Python代码清单
# !/usr/bin/python3 # _*_ coding:utf-8 _*_ # 折半插入排序 import sys # 导入sys,使用argv接收外部参数。 import time # 导入time 用time() 进行记时。 import random # 导入随机数包生存随机数 def BIS(number,maxNumber): # 算法,number是传入生成的个数,maxNumber代表生成的最大数 # 生成随机数 timeStart = time.time() listA = [0] # 设置第一个值,防止 out of index ,设置变量 for i in range(number): listA.append(random.randint(0, maxNumber)) # 添加生成的值。 timeEnd = time.time() timeIs = timeEnd-timeStart print('生成%d个数的时间是%f' % (number, timeIs)) # print(listA) #################################################### # 进行排序 timeStart = time.time() for aim in range(2, number+1): # 选定范围 low = 1 # 设置低位 high = aim-1 # 设置高位为对象减1 listA[0] = listA[aim] # 设置对象 while(low <= high): # 判断高位与低位是否相交,若相交则说明找到位置。 mid = int((low+high)/2) # 折半取中间值 if((listA[mid]) > listA[0]): # 判断取右方值还是左方值。 high = mid - 1 # 取左方 高位为mid-1 else: low = mid + 1 # 取右方 低位为mid +1 for count in range(0, aim-low): # aim-low 是循环的次数 listA[aim] = listA[aim-1] # 这里是从后向前移 aim = aim - 1 # 向前加一 listA[low] = listA[0] # 最后替换值 timeEnd = time.time() timeIs = timeEnd-timeStart print('排序%d个数的时间是%f' % (number, timeIs)) # print(listA) if __name__ == '__main__': helpInfo = ''' This program is for Binary Insertion Sort. How to use it! Follow the example! python Binary_Insertion_Sort.py 10 100 The 10 representative will generate ten numbers. 100 representative the max-number you make. ''' command = sys.argv[0:] # 从键盘获取输入信息。 lenght = len(command) # 计算信息长度 if lenght != 3 or 'help' in command: # 第一判断,对长度是否合法与是否有帮助文字进行判断。 print(helpInfo) else: try: number = int(command[1]) # 第二次判断,对输入数据进行int转化,即判断是否为int maxNumber = int(command[2]) except ValueError: print(helpInfo) sys.exit(1) # 若不是int,则退出程序 BIS(number, maxNumber) # 调用方法,生成序列并排序。
有什么问题请联系我
QQ:3116316431 (请附上信息)E-mail:wongyinlong@yeah.net
相关文章推荐
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 数据结构之内部排序--快速排序
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 数据结构之直接插入排序、折半插入排序、希尔排序算法
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】内部排序之五:计数排序、基数排序和桶排序(含完整源码)
- 数据结构之内部排序--冒泡排序
- 数据结构之内部排序--排序的基本概念
- 【数据结构之排序11】各种内部排序方法的比较和选择
- 数据结构中内部排序总结
- 数据结构之 排序---折半插入排序(时间复杂度 O(nlog2 n) )
- 数据结构之内部排序--直接插入排序
- 数据结构之内部排序一
- 数据结构之内部排序--简单选择排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)