数据结构的运算之归并排序和基数排序

今天,我们来看看数据结构的运算的最后两个排序——归并排序和基数排序

1.归并排序

 

归并排序的算法实现:

#include<stdio.h>
#include<stdlib.h>

//归并排序
void Merge(int arr[],int nBegin,int nEnd)
{
    int nBegin1 = nBegin;
    int nEnd1 = nBegin +(nEnd-nBegin)/2;
    int nBegin2 = nEnd1+1;
    int nEnd2 = nEnd;

    int *pTemp = NULL;
    pTemp = (int *)malloc(sizeof(int)*(nEnd-nBegin+1));
    int i = 0;
    while(nBegin1 <= nEnd1 && nBegin2 <=nEnd2)
    {
        if(arr[nBegin1]<arr[nBegin2])
        {
            pTemp[i] = arr[nBegin1];
            i++;
            nBegin1++;
        }
        else
        {
            pTemp[i] = arr[nBegin2];
            i++;
            nBegin2++;
        }
    }
    //将剩余的数组元素继续放入
    while(nBegin1 <= nEnd1)
    {
        pTemp[i] = arr[nBegin1];
            i++;
            nBegin1++;
    }
    while(nBegin2 <= nEnd2)
    {
        pTemp[i] = arr[nBegin2];
            i++;
            nBegin2++;
    }

    //放回
    for(i = 0;i<nEnd-nBegin+1;i++)
    {
        arr[nBegin +i] = pTemp[i];
    }
    //释放
    free(pTemp);
    pTemp = NULL;
}

void MergeSort(int arr[],int nBegin,int nEnd)
{
    if(arr == NULL || nBegin>=nEnd) return;

    //分割
    int nMind = nBegin +(nEnd -nBegin)/2;

    MergeSort(arr,nBegin,nMind);
    MergeSort(arr,nMind+1,nEnd);

    //合并
    Merge(arr,nBegin,nEnd);
}

void Printf(int arr[],int nlength)
{
    if(arr == NULL||nlength<=0) return;
    int i;
    for(i=0;i<nlength;i++)
    {
        printf("%d ",arr[i]);
    }

}

int main()
{
    int arr[]={10,2,11,4,56};
    MergeSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
    Printf(arr,sizeof(arr)/sizeof(arr[0]));
    printf("\n");
    return 0;
}

2.基数排序:

 

 

完整代码:

#include<stdio.h>
using namespace std; 
int temp[100];
int bucket[10];
int maxBit(int data[],int n)
{
    //行这些代码在求n个元素的最大值 
    int maxData = data[0];
    for(int i=1;i<n;i++)
    {
        if(maxData<data[i])
            maxData=data[i];
    }
  
    //这些代码在求最大值的位数是多少 
    int d=1;    //d用来计数最大值的位数,因为既然是一个数,肯定至少有1位,所以d初始化为1 
    while(maxData>=10)  //将最大值不断/10,计算位数 
    {
        maxData/=10;
        d++;
    }
    return d;

void radixsort(int data[],int n)  //基数排序 
{
    int d = maxBit(data,n);  //求出最大位数
    int i,j,k;
    int radix = 1;
    for(i=1;i<=d;i++)   //进行d次排序
    {
        for(j=0;j<10;j++)   //每次分配前清空计数器
        {
            bucket[j]=0;
        }
        for(j=0;j<n;j++)    //统计每个桶的元素个数 
        {
            k=(data[j]/radix)%10;
            bucket[k]++;
        }
        
        //关键代码1 
        for(j = 1; j < 10; j++)
            bucket[j] = bucket[j - 1] + bucket[j]; 
       
       //关键代码2 
        for(j = n-1; j>=0; j--) 
        {
            k = (data[j] / radix) % 10;
            temp[bucket[k] - 1] = data[j];
            bucket[k]--;
        }
        for(j = 0; j < n; j++) //将临时数组的内容复制到data中
            data[j] = temp[j];
            
        radix = radix * 10;  //个位  -》 十位  -》百位 -》…… 
    } 
}
 
int main()
{
    int a[4]={2,1,34,4};   
    radixsort(a,4);         //a十待排序的数组 ,4是元素个数 
    for(int i=0;i<4;i++)
        cout<<temp[i]<<" ";
    return 0;
}

 

 基数排序只使用于关键字取值范围一定的排序,对于大数据来说,它的效率是最高的,比快速排序和堆排序都略胜一筹。

 

 

 好啦,随着这两种排序的分享完,我们数据结构的运算这部分内容就要暂时告别一段落啦,后面如果有补充的话,博主也会发表文章补充。

本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值