`

Python折半插入排序

 
阅读更多
折半插入排序是插入排序的一种,这是直接插入排序的改进,当将要为i元素排序时,[0,i-1]位置的元素已有序,用折半查找法比顺序查找一般要快些.

实现思路:

i属于[1,n], 

在[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]);  

 

 

分享到:
评论

相关推荐

    大学生实验排序 泡泡排序 直接插入排序 折半插入排序 希尔排序 直接选择排序 统计时间 比较次数和交换次数 保存为txt文件

    本实验涉及了六种常见的排序算法:泡泡排序、直接插入排序、折半插入排序、希尔排序、直接选择排序,并且对每种排序算法进行了性能分析,包括统计执行时间、比较次数和交换次数。这些数据被保存在TXT文件中,便于...

    python实现直接排序和折半插入排序

    该资源主要是使用python来实现直接插入排序算法和折半插入排序算法。

    Python实现的直接插入排序算法示例

    以下是Python实现的直接插入排序算法的详细解释: ```python # -*- coding:utf-8 -*- '''直接插入的python实现 时间复杂度O(n^2) 空间复杂度O(1) 稳定思想:先将前两个元素排序,第三个元素插入前面已排好序列,...

    排序(二)插入排序 c/c++与python实现

    主要有直接插入排序、折半插入排序和希尔排序。 直接插入排序(Straight Insertion Sort) 直接插入排序的基本思想:首先,我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,...

    冒泡排序&选择排序&插入排序

    冒泡排序、选择排序和插入排序是三种基本的排序算法,它们都是针对数组或列表进行操作,目的是将无序的数据序列调整为升序或降序的有序序列。 **冒泡排序**: 冒泡排序的核心思想是通过重复遍历待排序的数列,比较...

    学生信息管理系统的设计与实现

    - **后端技术**:Java、Python、PHP等,用于处理业务逻辑。 - **数据库技术**:MySQL、Oracle、SQL Server等,用于存储和管理数据。 ##### 3. 功能模块 学生信息管理系统通常包含以下核心功能模块: - **学生档案...

    使用python实现常用算法,包括冒泡排序/选择排序/插入排序/归并排序/快速排序/堆排序/二分查找/并查集/最小生成树/最小路

    Python实现插入排序通常用到一个for循环来遍历整个数组,内部则用一个while循环来找到合适的位置并插入元素。 4. **归并排序**: 归并排序是分治策略的典型应用,将大问题分解为小问题来解决。它将数组分成两个子...

    java数据结构与算法之插入排序详解

    插入排序的分类主要包括直接插入排序、折半插入排序和希尔排序,它们各自有不同的实现方式和应用场景。 直接插入排序是最基本的插入排序方法,它是在有序序列中进行逐个元素插入操作。对于数组而言,每插入一个元素...

    折半查找main.cpp

    折半插入排序(Binary Insertion Sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。 排序思想:有一组数据待排序,排序区间为Array[0]~Array[n-1]。将数据分为...

    排序算法 sort 经典

    常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。这些算法在效率、稳定性、空间复杂度等方面各有特点,适用于不同的场景。 二、基本排序算法 1. 冒泡排序:通过不断交换相邻的逆序...

    数据结构排序查找常用算法实现.zip

    希尔排序是对插入排序的一种优化,通过插入排序的“跳跃”版本来工作,即先将数组分成若干子序列,然后对每个子序列进行插入排序,最后逐步减小子序列的间隔直至为1,完成排序。希尔排序的时间复杂度一般介于O(n)和...

    二分查找排序算法.zip

    二分查找排序算法是一种高效的排序方法,它是基于二分查找思想和插入排序的结合体。在计算机科学中,排序算法是处理数据集合的一种基础方法,它使得数据按照特定的顺序排列,例如升序或降序。二分查找排序算法特别...

    数据结构与算法(JAVA语言版)

    ### 数据结构与算法(JAVA语言版) #### Java与面向对象程序设计 - **Java语言基础知识** ... - **折半插入排序**:解释折半插入排序相对于直接插入排序的优化。 - **希尔排序**:探讨希尔排序的实现方法及其特点。

    python编程老师面试题_python面试题五:Python编程

    常见的排序算法有冒泡排序、选择排序、插入排序、归并排序、快速排序等。下面是实现三种排序算法的代码: ``` # 冒泡排序 def bubble_sort(lst): n = len(lst) for i in range(n-1): for j in range(n-i-1): if...

    《Python算法详解》读书笔记模板.pptx

    5. 排序算法:包括冒泡排序、选择排序、插入排序、归并排序等。 6. 数学问题的解决:包括线性规划、整数规划、动态规划等。 7. 经典算法问题的解决:包括背包问题、最短路径问题、最大流问题等。 8. 图像问题的解决...

    30.红黑树_3.wmv(目前数据结构最好的视频,共42集,需要哪一集的知识自己下,一集3积分)

    09插入排序 10快速排序 11归并排序 12顺序栈 13顺序队列 14链表的基本概率 15链表 16链表的迭代器 17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27...

Global site tag (gtag.js) - Google Analytics