`

排序算法--桶排序(基数排序)

 
阅读更多

1.基数排序

     基数排序的思想是针对整数的每一位进行排序,它是一种稳定的排序,从个位开始比较,小的再前面,大的排在后面,然后顺次取出,对取出后的数据组针对下一位再进行排序,一直排到位数最多的那一位排完为止!

     当桶排序的输入符合均匀分布时,可以期待线性期望时间运行,它的时间复杂度大概为o(n*m);n代表数组长度,m代表最长位的位数。

    但桶排序的缺点是耗费空间比较大,而且它并不能排序小数,不过可以先将小数转换为整数,再排序,以及负数,负数要分两部分排,首先是纯正数A那一块先排,然后负数为一块B化为正数再排,然后转换为负数颠倒,然后再加上原先的正数A那一堆组合起来!

    示例代码如下:

#include <iostream>
#include<vector>
using namespace std;


vector< vector<int> > myVector;//二维

//后续处理
//取出排序后的数
void follow_Slove(int* A)
{   
	int vert = 0;

	for ( int i=0; i< myVector.size(); i++)
	{
		for ( int j=0; j< myVector[i].size(); j++)
		{
                A[vert] = myVector[i][j];
				vert++;
		}
		myVector[i].clear();//移除所有元素
	}

}


/*基数排序,又名桶排序
   A:待排数组
   len:数组长度
   bitLen:最长整数的位数
   默认采用10进制数
*/
void bucket_Sort(int* A,int len,int bitLen,int scale)
{
	//基于每个数的个位,十位,百位,分别每次排序
	
	int baseValue = 10;//为了求余取出各位数字
	int vert;
	myVector.resize(scale);
	//每一位
	for (int i=0;i<bitLen;i++)
	{  
		//每一个数
       for ( int j=0;j < len;j++)
       {    
		   //注意这里取每一位数的方法
            vert = A[j] % baseValue;//这是得到余数
            vert = vert / (baseValue/10) ; //这才取到每一位上的数
			myVector[ vert ].push_back(A[j]);
       }

	   //将这一遍的排序后的顺序从vector中取出并保存到原数组A,再进行下一次评价
	   //以及清空vector,以便下次排序
	   follow_Slove(A);
	   baseValue = baseValue * 10; //改变求余
	}
	
}

//计算整数的最长位是多少
void cal_bitLen(int* A,int len,int& bitLen)
{  
   int max = -1; //保存最长位
   int temp;
   int count = 1;

   for ( int i=0; i < len ; i++)
   {
        temp = A[i];
		count = 0;

		while ( temp)
		{
			temp = temp/10;
			count++;
		}

		if ( count > max)
		  max = count;
   }
   bitLen = max ; 
}
int main(void)
{  
	int A[6] = {1111,22,22,224,50,0};
	int bitLen;
	cal_bitLen(A,6,bitLen);
	bucket_Sort(A,6,bitLen,10);

	for (int i=0;i<6;i++)
	{
		cout << A[i]<<" ";
	}
	cout<<endl;
	return 0;
}
   

 

分享到:
评论

相关推荐

    经典算法的C#源码实现

    经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - 归并排序Merge sort 经典排序算法 - ...

    详解Java常用排序算法-基数排序

    基数排序(Radix Sort)是一种非比较排序算法,它的基本思想是将待排序的数组按照位数(个位、十位、百位)进行划分,然后依次对每个位上的数字进行排序,最终得到有序的数组。基数排序的时间复杂度为 O(d(n+k)),...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    桶排序算法是一种高效的排序算法,它的工作原理是通过将数组分为几个桶,然后将每个桶中的元素排序,以达到排序的目的。桶排序算法的时间复杂度为O(n+k),因此它适合大规模的数据排序。 10.计数排序算法 计数排序...

    java排序算法-大全.rar

    8. **计数排序、桶排序、基数排序**:这些是线性时间复杂度的非比较型排序算法,适用于特定的数据分布情况,例如整数排序。 这个压缩包中的Java代码实现可以帮助我们深入理解这些算法的逻辑和细节,同时也可以作为...

    《数据结构与算法》-李春葆 实验报告-典型排序算法实践-基数排序

    answer:这是因为基数排序算法使用了桶排序的思想,每个基数队列中存储的都是相同位数上的数字,因此可以避免关键字的比较,从而提高排序的效率。 本实验报告通过实现基数排序算法来掌握三类内部排序的设计思想、...

    各种查找与排序算法-笔试面试必备

    非比较排序算法如基数排序、桶排序和计数排序,不依赖于元素间的比较,而是利用了元素的固有特征进行排序,通常在特定条件下具有更高的效率。 #### 三、外部排序 外部排序涉及大量数据,通常超过内存容量,因此...

    算法-理论基础- 排序- 基数排序(包含源程序).rar

    **基数排序**是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个过程可以类比为人类按身高排队,然后再按照年龄、姓氏等其他特征进行进一步的排序。基数排序在处理...

    排序算法-基于C语言实现的排序算法之RadixSort实现.zip

    **排序算法——C语言实现的基数排序(RadixSort)详解** 在计算机科学中,排序算法是用于将一组数据按照特定顺序排列的算法。这里我们关注的是基数排序(RadixSort),这是一种非比较型整数排序算法,其原理是将...

    常见排序算法-C语言

    C语言实现常见排序算法。编译环境:VS2010。 包括: 冒泡排序 快速排序 直接插入排序 Shell排序 直接选择排序 堆排序 归并排序(递归和非递归两种) 桶式排序 基数排序:顺序和静态队列两种方法 索引排序(采用简单...

    算法-基础算法- 排序算法(包含源程序).rar

    8. 计数排序、桶排序和基数排序:这三种是线性时间复杂度的非比较排序算法,适用于特定类型的数据,如整数排序。它们不是比较元素之间的大小,而是利用数据特性进行排序。 了解并掌握这些排序算法有助于提升编程...

    排序算法-java实现

    7. **计数排序**(Counting Sort)、**桶排序**(Bucket Sort)和**基数排序**(Radix Sort):这三种排序算法属于非比较型排序,适用于特定类型的数据。例如,基数排序适用于整数排序,根据每一位进行排序。它们的...

    基数排序算法

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,尤其是在数值范围较大的情况下。在Linux系统,特别是Ubuntu 13.04这样...

    排序算法: 冒泡排序,桶排序,计数排序,堆排序,插入排序,合并排序,快速排序,基数排序,选择排序,希尔排序 Python实现

    本文将详细介绍九种常见的排序算法,包括冒泡排序、桶排序、计数排序、堆排序、插入排序、合并排序、快速排序、基数排序和选择排序,并特别关注Python语言的实现。 1. **冒泡排序**:这是一种简单的排序算法,通过...

    基数排序算法 java实现

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,因为其时间复杂度为线性,即O(n*k),其中n是待排序的元素数量,k是每...

    Java排序算法(桶排序,基数排序等)

    在计算机科学中,排序算法是用于对一组数据进行排列的算法。Java 中实现排序算法通常涉及到多种方法,每种算法都有其特定的适用场景和性能特点。下面将详细介绍标题和描述中提到的一些常见排序算法,并提供Java实现...

    算法-数据结构和算法-10-选择排序.rar

    - **计数排序**、**桶排序**和**基数排序**:适用于特定类型的数据,如非负整数,它们可以在线性时间复杂度内完成排序。 ### 实际应用: 在编程竞赛、数据结构与算法的学习中,选择排序是一个基础概念,有助于理解...

    基数排序算法.zip

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别...此外,理解基数排序也有助于你在面对其他非比较型排序算法如计数排序和桶排序时,能够更快速地理解和应用它们。

Global site tag (gtag.js) - Google Analytics