排序

排序的稳定性

排序的稳定性指的是带排序的记录序列中如果存在两个或两个以上的关键字相等的记录是,排序后能否保持原有的次序。

插入排序

插入排序的c语言实现

void InsertSort(SqList &L){
    if(LT(L.r[i].key,L.r[i-1].key)){
        L.r[0] = L.r[i];  //哨兵
        L.r[i] = L.r[i-1];
        for(j=i-2;LT(L.r[0].key,L.r[j].key);--j)
            L.r[j+1] = L.r[0];
    }
}

设置哨兵的目的可以免去查找过程中每一步都要检测整个表是否查找完毕,可以提高性能,同时防止越界。
时间复杂度为O( n2 )

折半插入排序
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];
    }
}

折半查找劲减少了关键字间的比较次数,而记录的移动次数不变,因此折半插入排序的时间复杂度仍未O( n2 )。

冒泡排序

每一趟把一个最大的数移到最后,进行n趟排序后即可。

快速排序

快速排序是对冒泡排序的一种改进。它是先将一趟排序分割成独立的两部分,其中一部分比另一部分的关键字小,再分别对这两部分记录继续进行排序,就可以使整个序列有序。

void QSort(SqList &L,int low,int high){
    if(low<high){
        pivotloc = Partition(L,low,high);
        QSort(L,low,pivotloc-1);
        QSort(L,pivotloc+1,high);
    }
}

void Partition(SqList &L,int low,int high){
    L.r[0] = L.r[low];
    pivotkey = L.r[low].key;
    while(low<high){
        while(low<high && L.r[high].key>=pivotkey) --high;
        L.r[low] = L.r[high];
        while(low<high && L.r[low].key<=pivotkey) ++low;
        L.r[high] = L.r[low];
    }
    L.r[low] = L.r[0];
    return low;
}

若初始记录有序或基本有序的情况下,快排则变得和冒泡排序一样,快排选择枢轴记录就很重要,较为简单的一种选择方法是三数中值分割法,即在第一个数,中间的数和最后一个数中取中值作为枢轴。
快排的时间复杂度为O(nlogn),且是同数量级的排序方法中,平均性能最好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值