排序之插入排序(二分法)

1 基本思想

二分法插入排序和上一篇的插入排序本质上没有区别,都是从无序序列中取出数据和有序序列进行对比,放到合适的位置。
区别在于:
1.1上篇的插入排序是逐个和有序序列进行对比
1.2因为有序序列是一个有序序列(废话),所以可以结合二分查找的方法,找到正确的位置,将元素插入。

关于二分查找,这里就不再详细描述了。

2 图示

3 代码

#include <stdio.h>
#include <string.h>

//type为0时为排序从小到大
int Insert2(int array[], int len, int type)
{
    int i = 0;
    int j = 0;
    int value = 0;
    int start = 0;
    int end = 0;
    int mid = 0;
    
    for (i = 1; i < len; i++)
    {    
        value = array[i];
        start = 0;
        end = i - 1;
        
        while (start <= end)
        {
            mid = (start + end) / 2;
            
            if (type == 0 ? (array[mid] > value) : (array[mid] < value))
            {
                end = mid - 1;
            }   
            else
            {
                start = mid + 1;
            }
        }

        //此时的start = end + 1的位置即为value的真正位置
        for (j = i ; j >= start; j--)
        {
            array[j] = array[j-1];
        }
        array[start] = value;
    }
    
    return 0;
}

int main()
{
    int array[] = {9,6,5,3,1,13,2,8,7,4,5,28,5,8,6,3};
    int i = 0;
    int t = sizeof(array)/sizeof(int);
    
    Insert2(array, t, 1);  
    
    printf("array is:");
    for (i = 0; i < t; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");
 
    return 0;
}

4 测试结果

#./test
array is:28 13 9 8 8 7 6 6 5 5 5 4 3 3 2 1 

5 时间复杂度

二分插入排序和插入排序的复杂度一致,也是O(n^2)
二分插入排序是稳定的

猜你喜欢

转载自blog.csdn.net/u011003120/article/details/89384711
今日推荐