内部排序
Posted ciel12138
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部排序相关的知识,希望对你有一定的参考价值。
1.假设Ri=Rj,若排序前的序列中Ri领先于Rj,排序后Ri仍领先于Rj,则称所用的排序方法是稳定的,否则称所用的排序方法是不稳定的。
由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,将排序方法分为两大类:
1.内部排序:指待排序记录存放在计算机随机存储器中进行的排序过程。
2.外部排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。
2.插入排序
1.直接插入排序:将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表。时间复杂度为O(n^2)
1 void InsertSort(SqList &L){ 2 //对顺序表L作直接插入排序 3 for(i=2;i <=L.length;++i) 4 if(LT(L.r[i].key,L.r[i-1].key )){ 5 L.r[0]=L.r[i]; 6 L.r[i]=L.r[i-1]; 7 for(j=i-2 ; LT(L.r[0].key ,L.r[j].key);--j) 8 L.r[j+1]=L.r[j]; 9 L.r[j+1]=L.r[0]; 10 } 11 }
2.其他插入排序
1.折半插入排序,时间复杂度为O(n^2)
void BInsertSort(SqList &L){ for(i=2;i<=L.length;++i){ L.r[0]=L.r[i]; low=1;high=i-1; while(low <= high){ m=(low+high)/2; if(LT(L.r[0].key,L.r[m].key)) high=m-1; else low=m+1; } for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } }
2. 2-路插入排序,时间复杂度仍为O(n^2)
2-路插入排序是在折半插入排序的基础上再改进的,目的是减少排序过程中移动记录的次数,但需要n个记录的辅助空间。
3.表插入排序,时间复杂度为O(n^2)
希望在排序过程中不移动记录,只有改变存储结构,进行表插入排序。
#define SIZE 100 typedef struct{ RcdType rc; //记录项 int next; //指针项 }SLNode; typedef struct{ SLNode r[SIZE]; int length; }SLinkListType;
void Arrange(SLinkListType &SL){
p=SL.r[0].next;
for(i=1;i<SL.length;++i){
while(p<i)p=SL.r[p].next;
q=SL.r[p].next;
if(p!=i){
swap(SL.r[p],SL.r[i]);
SL.r[i].next=p;
}
p=q;
}
}
3.希尔排序
希尔排序又称"缩小增量排序",它也是一种属插入排序类的方法,但在时间效率上较前几种排序方法有较大改进。
其基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。
void ShellInsert(SqList &L,int dk){
//r[0]只是暂存单元,不是哨兵 当j<=0时,插入位置已经找到
for(i=dk+1;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-dk].key)){
L.r[0]=L.r[i];
for(j=i-dk;j>0 && LT(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 dlta[],int t){
for(k=0;k<t;++k)
ShellInsert(L,dlta[k]);
}
以上是关于内部排序的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段