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

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)
二分插入排序是穩定的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章