美文网首页
插入排序

插入排序

作者: 逝者如斯zy | 来源:发表于2019-07-17 00:44 被阅读0次

1. 直接插入排序

  • 查找出L(i)在L[1...i-1]中的插入位置k
  • 将L[k...i-1]中所有元素全部后移一个位置
  • 将L(i)复制到L(k)

稳定排序,适用于顺序存储和链式存储,时间复杂度为O(n^2)

void InsertSort(ElemType A[], int n){
    int i,j;
    for(i=2; i<=n; i++){
        if(A[i].key<A[i-1].key){
            A[0]=A[i];
            for(j=i-1; A[0].key<A[j].key; --j){
                A[j+1]=A[j];
            }
            A[j+1]=A[0];
        }
    }
}

2. 折半插入排序

稳定排序, 时间复杂度为O(n^2), 比较次数O(nlog_2n)

void HalfInsertSort(ElemType A[], int n){
    int i, j, low, high, mid;
    for(i=2; i<=n; i++){
        A[0]=A[i];
        low=1;
        high=i-1;
        while(low<=high){
            mid=(low+high)/2;
            if(A[mid].key>A[0].key){
                high=mid-1;
            }
            else{
                low=mid+1;
            }
        }
        for(j=i-1; j>high+1; --j){
            A[j+1]=A[j];
        }
        A[high+1]=A[0]; 
    }
}

3. 希尔排序

不稳定排序,仅适用于线性表为顺序存储的情况

void ShellSort(ElemType A[], int n){
    for(dk=n/2; dk>=1; dk/=2){
        for(i=dk+1; i<=n; ++i){
            if(A[i].key<A[i-dk].key){
                A[0]=A[i];
                for(j=i-dk; j>0&&A[0].key<A[j].key; j-=dk){
                    A[j+dk]=A[j];
                }
                A[j+dk]=A[0]
            }
        }
    }
}

相关文章

网友评论

      本文标题:插入排序

      本文链接:https://www.haomeiwen.com/subject/jdezkctx.html