数据结构之排序(一)

本文详细介绍了归并排序和基数排序的实现原理及步骤。归并排序通过不断合并有序子序列来达到整体有序的目的,而基数排序则通过按位分配元素到桶中再收集的方式实现排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序

归并:就是将两个或两个以上的有序表合成一张新的有序表。

两路归并算法的基本思想:设有两个有序表A和B,其数据长度分别为n,m,变量i和j分别为AB表当前检测指针,设C为归并后的新有序表,变量k为当前存放指针。开始时,i,j,k分别指向表的起始位置,依次比较A[i]与B[j]的大小,将小的(假设此处为递增有序)存入C[k]中,之后i(或j)和k加一,如此反复直到A和B表中有一个指针(i或j)已经到达表尾,则将另一表剩下的元素全部加入C表中。

template<class ElemType>
void Merge(ElemType elem[],int low,int mid,int high){
    ElemType *tmpElem=new ElemType[high+1];//定义临时数组
    int i=low,j=mid+1,k=low;
    while(i<=mid&&j<=high)
         if(elem[i]<=elem[j])
              tmpElem[k++]=elems[i++];
         eles
              tmpElem[k++]=elems[j++];
   while(i<=mid)
         tmpElem[k++]=elem[i++];
   while(j<=high)
         tmpElem[k++]=elem[j++];
   for(i=low;i<=high;i++)
         elem[i]=tmpElem[i]
   delete []tmpElem;
}

两路归并排序:就是利用两路归并算法进行排序。

两路归并排序基本思想:假定初始数据表中有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(归并项),先做两两归并,得n/2想上取整个长度为2的归并项(如果n为奇数,则最后一项为1);再做两两归并。。。。如此反复,最后得到以一个长度为n有序序列。刚开始len等于1,之后每次翻倍

template<class ElemType>
voud MergeSort(ElemType elem[],int n)
{
    int len=1,i;
    while(len<n){
        i=0;
        while(i+2*len<=n){
            Merge(elem,i,i+len-1,i+2*len-1);
            i+len*2;
        }
        if(i+len<n)}
            Merge(elem,i,i+len-1,n-1);
        }
        len*=2;
    }
}

时间复杂度:O(nlog2n)

空间复杂度:O(n)

两路归并排序是一个稳定的排序方法。


基数排序--桶排序

例子:扑克牌排序。

比如存储三位数字的数组排序,先按个位的递增顺序排,再按十位到百位排,最终得到基数排序后的有序序列。

时间复杂度:O(d(n+radix))

空间复杂度:附加的存储空间是为每个数据元素结点增设的链接指针,及为每一个队列设置的队头和队尾,总共为n+2*radix

基数排序中不需要移动数据元素,并且它是一种稳定的排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值