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;
}