经典算法之折半插入排序

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

今天主要给大家分享 折半插入排序 相关的知识点,希望通过通俗易懂的语言和大家一起学习,一起进步。针对折半插入排序可以类比排序排序算法。其实,折半插入排序,就是对插入排序算法的一种改进。它是一种稳定的排序算法。为什么说稳定呢?因为折半插入查找只是减少了比较次数,不会更改元素的位置。在执行速度上,要快于直接插入排序。

1. 算法思想

有N个数据待排序,将数据分为有序数据和无序数据,第一次排序时默认a[0]为有序数据,a[1]~a[n-1]为无序数据。有序数据分区的第一个元素位置为low,最后一个元素的位置为high。

具体执行过程如下

将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则每轮比较时将待插入元素与 a[mid],其中 mid=(low+high)/2相比较,如果比参考元素小,则选择 a[low] 到 a[mid-1] 为新的插入区域( 即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=mid+1),如此直至 low<=high 不成立,即将此位置之后所有元素后移一位,并将新元素插入 a[high+1]。

2.伪代码

for i = 2 to A.length
    if A[i] < A[i - 1]
        tmp = A[i]
        low = 0
        high = i - 1
        while low <= high
            mid = (low + high) / 2
            if A[mid] > tmp
                high = mid - 1
            else
                low = mid + 1
        for j = i - 1 downto high + 1
            A[j + 1] = A[j]
        A[high + 1] = tmp

3. 核心代码实现

3.1 Java版


public class HalfSearchSort {
    
    
    public void sort(int[] array){
    
    
        int temp;
        for(int i = 1; i < array.length; i++){
    
    
            int low = 0;
            int hight = i-1;
            temp = array[i];
 
            while(hight>=low){
    
    
                int mid = ( low + hight ) / 2;
                if (array[mid] > temp){
    
    
                    hight = mid - 1;
                }else{
    
    
                    low = mid + 1;
                }
            }
            for (int j = i-1; j > hight; j--) {
    
    
                array[j+1] = array[j];
            }
            array[hight+1] = temp;
        }
    }

}

3.2 Python 版

def halfSearchSort():
    for node in arr:
        end = len(list)
        start = 0
        mid = end // 2
        if 0 != end:
            while True:
                if node > list[mid]:
                    start = mid + 1;
                else:
                    end = mid;
                mid = start + (end - start) // 2
                if start >= end:
                    break;
        list.insert(start, node)

4. 算法效率分析

4.1 时间复杂度

如果输入的元素是反向有序,那么每次都需要进行位置查找,由于区间每次都缩减一半,所以得到寻找位置的次数最多为logi,但是移动元素的次数没有变,所以时间复杂度依然为O(n^2)

4.2 空间复杂度

算法在执行过程中,只需要额外的变量记录关键信息,所以空间复杂度为O(1)

欢迎小伙伴们,留言,私信。

扫描二维码关注公众号,回复: 14998360 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_42182599/article/details/126325066