今天,我们来看看数据结构的运算的最后两个排序——归并排序和基数排序
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;
}
基数排序只使用于关键字取值范围一定的排序,对于大数据来说,它的效率是最高的,比快速排序和堆排序都略胜一筹。
好啦,随着这两种排序的分享完,我们数据结构的运算这部分内容就要暂时告别一段落啦,后面如果有补充的话,博主也会发表文章补充。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.