折半插入排序是插入排序的一种,这是直接插入排序的改进,当将要为i元素排序时,[0,i-1]位置的元素已有序,用折半查找法比顺序查找一般要快些.
在[0,i-1]中取得中间位置k=(min+max)/2,这个区间已排好序,递归比较中间值, 直到 |min-max| <=1为止,将i元素插入到k附近.
#折半排序类
class HalfInsertSort:
#开始排序
#arrData:要排序的数组
def sort(self, arrData):
for i in range(1,len(arrData)):
self.halfSort(arrData,i,0,i-1);
print(arrData);
return;
#折半排序
#target:要排序的目标的索引值
#mi:已排序的最小索引
#ma:已排序的最大索引
#target要在[mi,ma]中查找合适的位置
def halfSort(self,arrData,target,mi,ma):
i=(mi+ma)//2;#中间索引
c=arrData[target]-arrData[i];
if mi==ma or i==ma or i==mi:
d=arrData[target]-arrData[ma];
if c>=0 and d<0:
self.insert(arrData,target,i + 1);
elif c<0:
self.insert(arrData,target,i);
elif d>=0:
self.insert(arrData,target,ma + 1);
return;
if c>0:
self.halfSort(arrData,target,i+1,ma);
elif c==0:
self.insert(arrData,target,i+1);
return;
else:
self.halfSort(arrData,target,mi,i-1);
return;
#将目录插入到dest位置
def insert(self,arrData,target,dest):
tmp=arrData[target];
i = target - 1;
#将dest身后的已排序的元素向后移动一位
while i>=dest:
arrData[i+1]=arrData[i];
i = i -1;
arrData[dest]=tmp;
return;
sortVal=HalfInsertSort();
sortVal.sort([7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58]);
[2, 7, 5, 3, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[2, 5, 7, 3, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[2, 3, 5, 7, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 7, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 7, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 48, 100, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 38, 48, 100, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 38, 45, 48, 100, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 38, 45, 48, 100, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 34, 38, 45, 48, 100, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 34, 38, 45, 48, 67, 100, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 34, 38, 45, 48, 67, 100, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 67, 100, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 67, 90, 100, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 58, 67, 90, 100]
自己实现的排序算法还是和书上的不一样,不用递归更简单些
#折半排序类
class HalfInsertSort:
#开始排序
#arrData:要排序的数组
def sort(self, arrData):
for i in range(1,len(arrData)):
self.halfSort(arrData,i,0,i-1);
print(arrData);
return;
#折半排序
#target:要排序的目标的索引值
#mi:已排序的最小索引
#ma:已排序的最大索引
#target要在[mi,ma]中查找合适的位置
def halfSort(self,arrData,target,mi,ma):
i=(mi+ma)//2;#中间索引
c=arrData[target]-arrData[i];
if mi==ma or i==ma or i==mi:
d=arrData[target]-arrData[ma];
if c>=0 and d<0:
self.insert(arrData,target,i + 1);
elif c<0:
self.insert(arrData,target,i);
elif d>=0:
self.insert(arrData,target,ma + 1);
return;
if c>0:
self.halfSort(arrData,target,i+1,ma);
elif c==0:
self.insert(arrData,target,i+1);
return;
else:
self.halfSort(arrData,target,mi,i-1);
return;
#将目录插入到dest位置
def insert(self,arrData,target,dest):
tmp=arrData[target];
i = target - 1;
#将dest身后的已排序的元素向后移动一位
while i>=dest:
arrData[i+1]=arrData[i];
i = i -1;
arrData[dest]=tmp;
return;
#非递归插入排序
def halfSort_(self,arrData,target,mi,ma):
low = mi;
high = ma;
k = 0;
while low <= high:
k = (low + high) // 2;
if arrData[target] > arrData[k]:
low = k+1;
else:
high = k - 1;
if arrData[target] >= arrData[k]:
self.insert(arrData,target,k+1);
else:
self.insert(arrData,target,k);
return;
def sort_(self, arrData):
for i in range(1,len(arrData)):
self.halfSort_(arrData,i,0,i-1);
print(arrData);
return;
sortVal=HalfInsertSort();
sortVal.sort_([7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58]);
相关推荐
该资源主要是使用python来实现直接插入排序算法和折半插入排序算法。
主要介绍了Python实现的直接插入排序算法,结合实例形式分析了Python直接插入排序算法的定义与使用相关操作技巧,代码备有较为详尽的注释便于理解,需要的朋友可以参考下
主要有直接插入排序、折半插入排序和希尔排序。 直接插入排序(Straight Insertion Sort) 直接插入排序的基本思想:首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,...
折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。 排序思想:有一组数据待排序,排序区间为Array[0]~Array[n-1]。将数据分为...
09插入排序 10快速排序 11归并排序 12顺序栈 13顺序队列 14链表的基本概率 15链表 16链表的迭代器 17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27...
09插入排序 10快速排序 11归并排序 12顺序栈 13顺序队列 14链表的基本概率 15链表 16链表的迭代器 17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27...
09插入排序 10快速排序 11归并排序 12顺序栈 13顺序队列 14链表的基本概率 15链表 16链表的迭代器 17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27...
– 平方时间复杂度 – 简单排序算法(选择排序、插入排序、冒泡排序) – 立方时间复杂度 – Floyd算法 / 矩阵乘法运算 – 几何级数时间复杂度 – 汉诺塔 – 阶乘时间复杂度 – 旅行经销商问题 – NP 排序算法...
09插入排序 10快速排序 11归并排序 12顺序栈 13顺序队列 14链表的基本概率 15链表 16链表的迭代器 17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27...
(插入排序、冒泡排序、快排、快速排序、归并排序、堆排序、桶排序) (朴素字符串匹配、KMP算法) (折半查找) (匈牙利算法、KM算法)TODO (Kahn's 算法、深度优先搜索、DFS) [求拓扑图的最短路径算法] TODO ...
11.1.3 插入排序 305 11.2 较快排序算法 307 11.2.1 归并排序 307 11.2.2 快速排序 312 11.2.3 基数排序 319 11.3 各种排序算法的比较 321 C++片段4 类关系和重用 325 C4.1 回顾继承 326 C4.1.1 类的公有、...
插入排序 D. 快速排序 -----------------选择: 4. 程序调用自身的编程技巧称为()。 A. 继承 B. 复用 C. 递归 D. 循环 -----------------选择: 5. 大量的计算机通过网络被连结在一起,可以获得极高的运算能力及...