折半插入

来源:互联网 发布:域名服务器名词解释 编辑:程序博客网 时间:2024/06/03 16:42

设待排序的关键字序列为{12,2,16,30,28,10,16,20,6,18},用折半插入对其进行排序。

折半插入排序和折半查找类似,对当前表定义一个high,low,mid分别记录数据位置。high是高位置,low是

地位置,mid是当前的中间位置,每次比较都是拿当前数与中间位置的数比较。如果大于中间数就让low=mid+1

否则high=mid-1。找到要插入的位置之后,把后面的元素依次后移一位,再把元素插到当前的位置就行了

#include <iostream>
using namespace std;

typedef struct{
    int key;
    char otherinfo;
}Elemtype;


typedef struct SqNode{
    Elemtype *data;
    int length;
}SqList;


void InitList(SqList *S){ //初始化
    S->data=new Elemtype[maxsize+1];
    S->length=10;
    S->data[1].key=12;
    S->data[2].key=2;
    S->data[3].key=16;
    S->data[4].key=30;
    S->data[5].key=28;
    S->data[6].key=10;
    S->data[7].key=16;
    S->data[8].key=20;
    S->data[9].key=6;
    S->data[10].key=18;
}

void BInsertSort(SqList *S){ //折半插入
    int i,j,low,high,mid;


    for(i=2;i<=S->length;++i){
        S->data[0].key=S->data[i].key;
        low=1,high=i-1;
        while(low<=high){
            mid=(low+high)/2;
            if(S->data[0].key<S->data[mid].key) high=mid-1;
            else low=mid+1;
        }
        for(j=i-1;j>=high+1;j--) S->data[j+1].key=S->data[j].key;
        S->data[high+1].key=S->data[0].key;
    }
}

int main()
{

SqList S;
    int dt[]={5,3,1};

BInsertSort(&S);
    PrintList(&S);

 return 0;
}

0 0
原创粉丝点击