插入排序

1. 直接插入排序

空间复杂度: O(1)
(平均)时间复杂度: O(n2)
稳定性:稳定的排序算法
适用场景:当待排序记录的数量n很小时,这是一种很好的排序方法。但是,通常当排序列中的记录数n很大,则不宜采用直接插入排序。

代码:

#include <iostream>
#include <stdio.h>
#define MAXSIZE 20
typedef int keyType;
typedef char* InfoType;
using namespace std;

typedef struct
{
    keyType key;
    InfoType otherInfo="";
}Record;

typedef struct
{
    Record rec[MAXSIZE+1];  //rec[0]作为哨兵单元,不需判断索引是否越界,比较到哨兵,不再会向前比较
    int length;
}SqList;
///Straight Insertion Sort,非递减
void StraInserSort(SqList &L)
{
    for(int i=2;i<=L.length;i++)
    {
        if(L.rec[i].key<L.rec[i-1].key)
        {
            L.rec[0]=L.rec[i];
            //L.rec[i]=L.rec[i-1];
            int j=i-1;
            for(;L.rec[0].key<L.rec[j].key;j--)
                L.rec[j+1]=L.rec[j];
            L.rec[j+1]=L.rec[0];
        }
    }
}

int main()
{
    SqList mL;
    mL.length=6;
    for(int i=1;i<=mL.length;i++)
        scanf("%d",&mL.rec[i].key);
    StraInserSort(mL);
    for(int i=1;i<=mL.length;i++)
        printf("%d ",mL.rec[i].key);
    printf("\n");
    return 0;
}

2. 希尔排序

时间复杂度:是所取增量的函数,有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在 n1.25 ~ 1.6n1.25 之间。
空间复杂度: O(1)
稳定性:不稳定
Note:增量序列中的值没有除1以外的公因子,最后一个增量必须为1。

代码:

#include <iostream>
#include <stdio.h>
#define MAXSIZE 20
typedef int keyType;
typedef char* InfoType;
using namespace std;

typedef struct
{
    keyType key;
    InfoType otherInfo="";
}RecNode;
typedef struct
{
    RecNode r[MAXSIZE];
    int length;
}SqList;
void ShellInsert(SqList &L,int dk)
{
    for(int i=dk+1;i<=L.length;i++)
    {
        if(L.r[i].key<L.r[i-dk].key)
        {
            L.r[0]=L.r[i];
            //L.r[i]=L.r[i-dk];
            int j=i-dk;
            for(;j>0&&L.r[0].key<L.r[j].key;j-=dk)
                L.r[j+dk]=L.r[j];
            L.r[j+dk]=L.r[0];
        }
    }
}
void ShellSort(SqList &L,int dkList[],int dkLength)
{
    for(int i=0;i<dkLength;i++)
        ShellInsert(L,dkList[i]);
}
int main()
{
    SqList mList;
    mList.length=6;
    for(int i=1;i<=mList.length;i++)
        scanf("%d",&mList.r[i].key);
    int mdkList[3]={5,3,1};
    int dkLength=sizeof(mdkList)/sizeof(mdkList[0]);
    printf("dkLength=%d\n",dkLength);
    ShellSort(mList,mdkList,dkLength);
    for(int i=1;i<=mList.length;i++)
        printf("%d ",mList.r[i].key);
    printf("\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值