当前位置:编程学习 > C/C++ >>

性时间排序-计数排序、基数排序和桶排序详解与编程实现

计数排序

计数排序假设n个输入元素中的每一个都是介于0到k之间的整数。此处k为某个整数(输入数据在一个小范围内)。

 

算法思想

计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数。然后再将x直接放置在它在最终输出数组中的位置上。

 


由于数组中可能有相等的数,在处理时需要注意。

 


时间复杂度和空间复杂度分析


算法总时间Θ(k + n)。当k=O(n)时,计数排序的运行时间是Θ(n)。

空间复杂度是O(n+k)。需要两个辅助数组:存放排序结果的数组B[n],存放临时结果的C[k]。


计数排序是稳定的排序算法。

 

 

编程实现(CPP)

[cpp] 
//计数排序-《算法导论(第二版)》P98 8.2计数排序  
//Author:江南烟雨  
//E-Mail:xiajunhust@gmail.com  
 
#include <iostream>  
#include <cstdlib>  
 
using namespace std; 
 
void CountSort(int *a,const int num,int *result) 

    int MaxVal = -99999; 
    for(int i = 0;i < num;++i) 
    { 
        if(MaxVal < *(a + i)) 
            MaxVal = *(a + i); 
    } 
    int *tempResult = new int[MaxVal + 5];//记录中间结果  
    for(int i = 0;i < MaxVal  + 5;++i) 
        *(tempResult + i) = 0; 
    //result[i]记录数组中值等于i的元素的个数  
    for(int i = 0;i < num;++i) 
        *(tempResult + *(a + i)) = *(tempResult + *(a + i)) + 1; 
    //result[i]记录数组中值小于等于i的元素的个数  
    for(int i = 1;i < MaxVal + 5;++i) 
        *(tempResult + i) = *(tempResult + i) + *(tempResult + i - 1); 
    //注意,数组中可能存在相等的元素  
    //将数组中各元素直接放入正确的位置  
    for (int i = num - 1;i >= 0;--i) 
    { 
        *(result + *(tempResult + *(a + i))) = *(a + i); 
        *(tempResult + *(a + i)) = *(tempResult + *(a + i)) - 1; 
    } 
 
    delete[] tempResult; 

 
int main() 

     int num = 7; 
    int *a = new int[num]; 
    for(int i = 0;i < num;++i) 
        *(a + i) = rand(); 
 
    cout << "Before sort: " << endl; 
    for(int i = 0;i < num;++i) 
        cout << *(a + i) << " "; 
    cout << endl; 
 
    int *result = new int[num + 5]; 
 
    CountSort(a,num,result); 
 
    cout << "After sort: " << endl; 
    for(int i = 1;i <= num;++i) 
        cout << *(result + i) << " "; 
    cout << endl; 
 
    delete[] a; 
    delete[] result; 

//计数排序-《算法导论(第二版)》P98 8.2计数排序
//Author:江南烟雨
//E-Mail:xiajunhust@gmail.com

#include <iostream>
#include <cstdlib>

using namespace std;

void CountSort(int *a,const int num,int *result)
{
 int MaxVal = -99999;
 for(int i = 0;i < num;++i)
 {
  if(MaxVal < *(a + i))
   MaxVal = *(a + i);
 }
 int *tempResult = new int[MaxVal + 5];//记录中间结果
 for(int i = 0;i < MaxVal  + 5;++i)
  *(tempResult + i) = 0;
 //result[i]记录数组中值等于i的元素的个数
 for(int i = 0;i < num;++i)
  *(tempResult + *(a + i)) = *(tempResult + *(a + i)) + 1;
 //result[i]记录数组中值小于等于i的元素的个数
 for(int i = 1;i < MaxVal + 5;++i)
  *(tempResult + i) = *(tempResult + i) + *(tempResult + i - 1);
 //注意,数组中可能存在相等的元素
 //将数组中各元素直接放入正确的位置
 for (int i = num - 1;i >= 0;--i)
 {
  *(result + *(tempResult + *(a + i))) = *(a + i);
  *(tempResult + *(a + i)) = *(tempResult + *(a + i)) - 1;
 }

 delete[] tempResult;
}

int main()
{
  int num = 7;
 int *a = new int[num];
 for(int i = 0;i < num;++i)
  *(a + i) = rand();

 cout << "Before sort: " << endl;
 for(int i = 0;i < num;++i)
  cout << *(a + i) << " ";
 cout << endl;

 int *result = new int[num + 5];

 CountSort(a,num,result);

 cout << "After sort: " << endl;
 for(int i = 1;i <= num;++i)
  cout << *(result + i) << " ";
 cout << endl;

 delete[] a;
 delete[] result;
}

 

基数排序

 

算法思想
基数排序是从低位到高位依次对所有的数进行排序。如果所有的数最高位数是d,那么先按最低有效位数字进行排序,得到一个结果。然后往高位重复这个过程。

需要注意的是,按位排序必须是稳定的排序算法。经常采用的是计数排序。

 


编程实现(CPP)

[cpp]
//基数排序  
//《算法导论(第二版)》P100 8.3 基数排序  
//Author:江南烟雨  
//E-Mail:xiajunhust@gmail.com  
 
#include <iostream>  
#include <cstdlib>  
#include <ctime>  
 
using namespace std; 
 
//得到某个整数第i位的数值  
int getDigitNun(int a,int digit); 
//按位排序  
void DigitSort(int *a,int n,int digit,int *result); 
//基数排序算法  
void RadixSort(int *a,int n,int d); 
 
int main() 

    int n = 7,i; 
    int *a = new int[n]; 
    srand(time(NULL)); 
    for(i = 0;i < n;++i) 
        *(a + i) = rand(); 
    //判断最大的数的位数  
    int MaxVal = -1,d = 0; 
    cout << "Before sort : " << endl; 
    for(i = 0;i < n;++i) 
    { 
        cout << *(a + i) << " "; 
        MaxVal = MaxVal < *(a + i) ? *(a + i) : MaxVal; 
    } 
    cout << endl; 
    while(MaxVal > 0) 
    { 
   &nb

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,