数据结构复习代码——排序算法(直接插入排序、折半插入排序、2-路插入排序、表排序)

1、排序算法(直接插入排序、折半插入排序、2-路插入排序、表排序)

#include<stdio.h>

#define T int
#define MAXSIZE 20

#define MAXVALUE 0x7fffffff
typedef T SqList[MAXSIZE];

typedef struct SLNode
{
    T data;
    int link;
}SLNode;


typedef SLNode Table[MAXSIZE];

//#define USER_ZERO_SPACE


//交换函数
void Swap(T *a,T *b)
{
    T tmp = *a;
    *a = *b;
    *b = tmp;
}
//直接插入排序---无哨兵位
void InsertSort(SqList &L,int n)
{
    for(int i=1;i<n;++i)
    {
        if(L[i]<L[i-1])
        {
            Swap(&L[i],&L[i-1]);
            for(int j=i-1;j>0&&L[j]<L[j-1];--j)
            {
                Swap(&L[j],&L[j-1]);
            }
        }
    }
}
//直接插入排序----零号位置为哨兵位置
void InsertSort1(SqList &L,int n)
{
    for(int i=2;i<n;i++)
    {
        if(L[i] < L[i-1])
        {
            L[0] = L[i];
            L[i] = L[i-1];
            int j;
            for(j=i-2;L[0]<L[j];--j)
            {
                L[j+1] = L[j];
            }
            L[j+1] = L[0];
        }
    }
}
//折半插入排序
void BInsertSort(SqList &L,int n)
{
    for(int i=2;i<n;++i)            //默认第一个元素已经排序好
    {
        L[0] = L[i];                //零位置记录需要进行插入的元素
        int low = 1;
        int high = i-1;
        while(low<=high)            //查询适合元素插入的位置
        {
            int mid = (low+high)/2;
            if(L[0]>=L[mid])
            {
                low = mid + 1;
            }
            else{
                high = mid - 1;
            }
        }                           //即插入位置为high+1
        for(int j=i;j>high+1;--j)   //移动high+1之后的元素
        {
            L[j] = L[j-1];
        }
        L[high+1] = L[0];           //元素插入
    }
}
//2-路插入排序
void TWayInsertSort(SqList &L,int n)
{
    //printf("%d \n",n);
    SqList TP;
    TP[0] = L[0];           //头元素赋值
    int head = 0;
    int tail = 0;
    for(int i=1;i<n;++i)    //遍历插入TP数组
    {
        if(L[i]<TP[head])   //头插入
        {
            head = (head-1+n)%n;
            TP[head] = L[i];
        }
        else if(L[i]>TP[tail])//尾插入
        {
            tail++;
            TP[tail] = L[i];
        }
        else                  //中间插入
        {
            tail++;
            TP[tail] = TP[tail-1];
            int j=0;
            for(j=tail-1;L[i]<TP[(j-1+n)%n];j=(j-1+n)%n)
            {
               // printf("%d^",j);
               // printf("\n");
                TP[j] = TP[(j-1+n)%n];
            }
            TP[j] = L[i];
        }
    }
    for(int i=0;i<n;++i)      //遍历赋值回L数组
    {
        L[i] = TP[head];
        //printf("%d ",TP[head]);
        head = (head+1)%n;
    }
    //printf("\n");
}
//表插入排序
void TableInsertSort(Table &t,int n)
{
    t[0].link = 1;
    int q,p;
    for(int i=2;i<n;++i)
    {
        p = t[0].link;
        q = 0;
        while(p!=0&&t[p].data<=t[i].data)
        {
            q = p;
            p = t[p].link;
        }
        t[i].link = t[q].link;
        t[q].link = i;
    }
}

int main()
{
    SqList L = {0,49,38,65,97,76,13,27,49};
    int n = 9;
    Table tb;
    tb[0].data = MAXVALUE;
    tb[0].link = 0;
    for(int i=1;i<n;++i)
    {
        tb[i].data = L[i];
        tb[i].link = 0;
    }
    TableInsertSort(tb,n);
    for(int i=0;i<n;++i)
    {
        if(tb[i].data == MAXVALUE)
            printf(" * ");
        else
            printf("%.2d ",tb[i].data);
    }
    printf("\n");
    for(int j=0;j<n;++j)
    {
        printf("%.2d ",tb[j].link);
    }
    printf("\n");
    return 0;
}

/*
int main()
{
    #ifdef USER_ZERO_SPACE
        SqList L = {0,49,38,65,97,76,13,27,49};
        int n = 9;
    #else
        SqList L = {49,38,65,97,76,13,27,49};
        int n=8;
        //InsertSort(L,n);
        //for(int i=1;i<n;i++)
        //{
        //    printf("%d ",L[i]);
        //}

        //InsertSort1(L,n);
        //BInsertSort(L,n);
    #endif // USER_ZERO_SPACE
        TWayInsertSort(L,n);

    #ifdef USER_ZERO_SPACE

        for(int i=1;i<n;i++)
        {
            printf("%d ",L[i]);
        }
    #else
        for(int i=0;i<n;i++)
        {
            printf("%d ",L[i]);
        }
    #endif
        return 0;

}
*/

 

posted @ 2022-07-31 11:27  往心。  阅读(36)  评论(0编辑  收藏  举报