二分法插入排序

ぐ巨炮叔叔 提交于 2020-03-06 21:49:30
#include "stdio.h"
#include "malloc.h"

typedef int KeyType;
typedef int DataType;

typedef struct {
    //排序码字段
    KeyType key;
    //记录的其他字段
    DataType info;
}RecordNode;

typedef struct
{
    int n;
    RecordNode * record;
}SortObject;

void binSort(SortObject * pvector)
{
    int i,j,left,right,middle;
    RecordNode temp;
    for(i=0;i<pvector->n;i++)
    {
        temp=pvector->record[i];
        left=0;
        right=i-1;
        while (left<=right) 
        {
            middle=(left+right)>>1;
            if (temp.key<pvector->record[middle].key) 
            {
                right=middle-1;
            }
            else
            {
                left=middle+1;
            }
        }
        for(j=i-1;j>=left;j--)
        {
            pvector->record[j+1]=pvector->record[j];
        }
        if (left!=i) 
        {
            pvector->record[left]=temp;
        }
    }
    
    for(i=0;i<pvector->n;i++)
    {
        printf("%d ",pvector->record[i]);
    }
}

int main(int argv ,char * argm[])
{
    int i,j=0,l,p;
    SortObject * object=(SortObject *)malloc(sizeof(SortObject));
    RecordNode * node=(RecordNode *)malloc(sizeof(RecordNode));
    printf("请输入数组的长度 \n");
    scanf("%d",&i);
    p=i;
    
    while (i>0) 
    {    
        printf("请输入数组的字段 \n");
        scanf("%d",&l);
        node[j].key=l;
        j++;
        i--;
    }
    
    object->record=node;
    object->n=p;
    
    binSort(object);    
    return 1;
    
}

结果:

当n较大时,显然比直接插入排序的最大比较次数少的多。但大于直接插入排序的最小比较次数。移动次数,最坏的情况为n²/2,最好的情况为n-1,平均移动次数为O(n²).算法中增加了一个辅助空间temp,因此,算法的辅助空间为S(n)=O(1)。二分法插入排序是稳定的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!