• 折半插入排序


    算法简介

    折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。

    算法动态演示:

    算法思想 

    折半插入排序利用二分法的思想,在一个有序的序列中,找到新元素在该序列中的位置,然后插入。如图1所示,共有n个元素,前i个元素已经是有序序列,现在要将第i个元素插入其中。折半插入排序需要做两步工作:找到待插入元素的位置、插入。

     

                                                         图1 插入排序示意图

     首先要定义两个指针(不是语法里面的指针,是下标的意思)low和high用于寻找a[i]的插入位置,low指向a[0],high指向a[i-1],中点mid=(low+high)/2.

                                                      图2 “折半”示意图

    如图2所示二分法的思想是,比较a[i]与a[mid]的大小,若a[i]>a[mid],说明a[i]的位置应该在mid~high之间,将区间[low,high]缩短为[mid+1,high],令指针low=mid+1;若a[i]<=a[mid],说明a[i]的位置应该在low~mid之间,将区间压缩为[low,mid-1],令指针high=mid-1。每次折半之后,a[i]的位置应该在[low,high]之间。

    如此循环,low与high渐渐靠近,直到low>high跳出循环,a[i]的位置找到,low即为a[i]应该放置的位置。

    找到a[i]的位置之后进行插入,先将a[low]~a[i-1]这些元素向后平移一个元素的位置,然后将a[i]放到low位置。

     

    算法分析

    一个细节:为什么内层的循环while(low<=high){...}结束之后以low作为a[i]应该放置的位置?

    第一种情况

    a[mid] < a[i] <=  a[high]:

    第N-2步时,mid=(low+high)/2,如果a[i]>a[mid],low=mid+1,这样就到了第N-1步,low与high重合,high=mid-1,这样就到了第N步,high<low,退出循环,此时位置high就是第N-2步的位置mid,所以此时,a[high]<a[i]<=a[low],所以low就是a[i]应该放置的位置。

     

    第二种情况

    a[low] <=  a[i] <  a[mid]:

     第N-2步,mid=(low+high) / 2,如果a[i] <= a[mid],high = mid-1,这样就到了第N-1步,low与high重合,mid=(low+high)/2=low=high,由于a[i]>a[low]=a[mid],所以low=mid+1,这样就到了第N步,high<low,退出循环,此时位置low就是第N-2步的位置mid,那么此时,a[high]<a[i]<=a[low],所以low就是a[i]应该放置的位置。

    典型的例子是一个父进程fork子进程之后,父进程立即退出,这样子进程所在的进程组将变为孤儿进程组。这样的孤儿进程组中的每个停止(Stopped)状态的每个进程都将收到挂断信号(SIGHUP),然后又立即收到继续信号(SIGCONT)。所以fork子进程之后,退出父进程,如果子进程还需要继续运行,则需要处理挂断信号,否则进程对挂断信号的默认处理将是退出。

    此时的孤儿进程组并没有变为后台进程,一些博客将后台进程说成是孤儿进程组的一个特点,笔者认为是不正确的,在他们的示例中,孤儿进程组变为后台进程的原因是:父进程退出后,子进程在运行时向自身发送了SIGTSTP信号,这就像在终端按下终端挂起键(ctrl+z)一样,暂时断开了进程与控制终端的连接,自然变成了后台进程。

    所以这是将进程转到后台运行的一个手段,但并不能创建守护进程,后面会将怎么创建守护进程。

    参考资料

    1. 折半插入排序

  • 相关阅读:
    SQL SERVER 性能优化四: 创建分区表
    SQL SERVER 性能优化一: 数据库中几百万数据查询优化
    SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置
    C++连接SQL SERVER 数据库方式
    利用作业定时收缩SQL SERVER数据库
    jQuery easyUI datagrid 增加求和统计行
    jquery easyui DataGrid 数据表格 属性
    jQuery easyui中获取datagrid某一列的值之和
    Maven + Springboot + redis 配置
    mac os Catalina beta Jetbrains idea闪退解决方案
  • 原文地址:https://www.cnblogs.com/sunbines/p/9158757.html
Copyright © 2020-2023  润新知