内部排序

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注入(代码片段

ForegroundService没有从片段开始?

底部导航 如何从片段内部更改片段

EasyClick 运行代码片段出Null

EasyClick 运行代码片段出Null