`
u010815305
  • 浏览: 30478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

计数,基数排序

 
阅读更多
计数排序
计数排序是建立在这样的前提条件下的:假设n个输入元素的每一个都是0到k区间内的一个整数,其中k为某个整数。因此我们后面所写的程序也只是针对0到k之间的元素进行排序,
换句话说,排序元素中不能有负数。
基本思想:
对一个输入元素x,先确定所有输入元素中小于x的元素个数,那么排序后x所在的位置也就明确了。比如,所有的输入元素中有10个元素小于x,那么排好序后x的位置序号就应该是11。
当然,如果有相同元素,自然要放到相邻的位置上。
/* 
第一种形式实现计数排序 
计数排序后的顺序为从小到大 
arr[0...len-1]为待排数组,每个元素均是0-k中的一个值 
brr[0...len-1]为排序后的输出数组 
crr[0...k]保存0...k中每个值在数组arr中出现的次数 
*/ 
void count_sort(int *arr,int *brr,int *crr,int len,int k)
{
	int i,j=0;
	for(i=0;i<=k;i++)
		crr[i]=0;
	 //统计数组arr中每个元素重复出现的个数
	 for(i=0;i<len;i++)
		crr[arr[i]]++;
	//求数组arr中小于等于i的元素个数  
	for(i=1;i<=k;i++)
		crr[i]+=crr[i-1];
	//把arr的元素放到brr 对应的位置
	for(i=len-1;i>=0;i--)
	{
		brr[crr[arr[i]]-1]=arr[i];
		
		crr[arr[i]]--;
	}
}
/*
第二种形式实现计数排序 
计数排序后的顺序为从小到大 
arr[0...len-1]为待排数组,每个元素均是0-k中的一个值 
crr[0...k]保存0...k中每个值在数组arr中出现的次数 
*/ 

void count_sort(int *arr,int *crr,int len,int k)
{

	int i,j=0;
	for(i=0;i<=k;i++)
		crr[i]=0;
	for(i=0;i<len;i++)
		crr[arr[i]]++;
	
	for(i=0;i<=k;i++)
		while((crr[i]--)>0)
		{
			arr[j++]=i;
		}
}

1、不是基于比较的排序,因此可以达到线性排序时间;
2、采取空间换时间的思想,需要brr和crr等辅助空间,但是时间复杂度仅为O(n+k);
3、稳定性好,这也是计数排序最重要的一个特性。
基数排序;
基数排序采取的是多关键字比较的策略,且每个关键字对排序的影响不同,根据关键字影响的主次,有两种排序方法:

1、先根据影响最大的关键字来排序,而后在该关键字相同的情况下,再根据影响次之的关键字来排序,依此类推,直到最后按照影响最小的关键字排序后,序列有序。我们称这个为先高位后低位。

2、先根据影响最小的关键字来排序,而后再对全部的元素根据影响次小的关键字来排序,依此类推,直到最后按照影响最大的关键字排序后,序列有序。我们称这个为先低位后高位。

/* 
在第一种计数排序的实现形式上做了些修改 
计数排序后的顺序为从小到大 
arr[0...len-1]为待排数组,我们这里采用三位数 
brr[0...len-1]为排序后的有序数组 
w[0...len-1]用来保存取出的每一位上的数,其每个元素均是0-k中的一个值 
crr[0...k]保存0...k中每个值出现的次数 
*/  
void count_sort(int *arr,int *brr,int *w,int *crr,int len,int k)
{
	int i;
	for(i=0;i<=k;i++)
		crr[i]=0;
	 //统计数组w中每个元素重复出现的个数 
	 for(i=0;i<len;i++)
		crr[w[i]]++;
	//求数组w中小于等于i的元素个数
	for(i=1;i<=k;i++)
		crr[i]+=crr[i-1];
	//把arr中的元素放在brr 中对应的位置上
	
	for(i=len-1;i>=0;i--)
	{
		brr[crr[w[i]]-1]=arr[i];
		//如果有相同的元素则放到下一位置
		crr[w[i]]--;
	}
	
	//再将brr的元素复制给arr
	for(i=0;i<len;i++)
		arr[i]=brr[i];
}
/*基数排序*/
void basic_sort(int *arr,int *brr,int *w,int *crr,int len,int k,int d)
{
	int i,j,val=1;
	//从低位到高位依次进行计数排序
	for(i=1;i<=d;i++)
	{
		//w中保存的是arr中每个元素对应位上的数  
        //范围在0-k之间 
		for(j=0;j<len;j++)
			w[j]=(arr[j]/val)%10;
		//对当前位进行计数排序
		count_sort(arr,brr,w,crr,len,k);
		val*=10;
	}

}
1、同样不是基于比较的排序,因此可以达到线性排序时间;

2、同样采取空间换时间的思想,需要额外的辅助空间,但是时间复杂度仅为O(d(n+k));

3、基数排序的稳定性同样也很好。



分享到:
评论

相关推荐

    C++写基数排序算法

    在C++中实现基数排序,主要涉及到数组、计数排序以及位操作等技术。以下是关于基数排序及其C++实现的详细解释: 一、基数排序概述 基数排序基于数字的位值进行排序,它首先根据最低有效位(个位)进行排序,然后是...

    基于分布计数的基数排序方法的研究

    【基于分布计数的基数排序方法的研究】 基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法非常适合处理大数据量且数据范围较大的场景,因为它...

    数据结构基数排序数据结构基数排序

    数据结构中的基数排序是一种非比较型整数排序算法,它基于数字的位宽进行排序,尤其适用于处理大量相同数字的情况。基数排序的核心思想是将数字按照位数从低位到高位分别进行桶排序,最终得到完全有序的序列。下面将...

    基数排序-radix sort

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法对于大数据量的处理非常有效,尤其适合于数据范围远大于内存大小的情况。以下是基数排序的详细...

    java基数排序

    本文将详细讲解Java中的基数排序,这是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序对于大数据量的整数排序具有很高的效率,尤其适用于处理多位数的数组。 ...

    基数排序课程设计.rar

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个课程设计主要涵盖了基数排序的基本概念、实现方式以及C++编程技术。在本课程设计中,你将学习到如何用...

    数据结构之基数排序数据结构之基数排序数据结构之基数排序

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法适用于处理大量数据,且数据的范围不超过10的某个幂次方的情况。基数排序是基于多关键字排序的一...

    桶排序,基数排序

    算法导论之基数排序,桶排序。基数排序是利用在各个位上进行计数排序,是一种线性排序

    基数排序_C语言_源码_数据结构

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序非常有效,尤其是在数据范围不超过0-9的情况下。接下来,我们将深入探讨基数排序...

    基数排序算法 java实现

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

    直接插入排序,快速排序,归并排序,堆排序,基数排序,计数排序。

    这里我们讨论六种经典的排序算法:直接插入排序、快速排序、归并排序、堆排序、基数排序和计数排序。这些排序算法在C语言中都有实现,并且在处理不同规模的数据时各有优势。 1. 直接插入排序: 直接插入排序是一种...

    C经典算法之基数排序法

    ### C经典算法之基数排序法 #### 知识点概览 1. **排序算法的基础概念** - 排序算法的基本定义与分类 - 比较性排序与非比较性排序的区别 - 稳定排序与不稳定排序的概念 2. **基数排序的原理** - 分配式排序的...

    常用排序PK 冒泡 快排 选择排序 基数排序 等

    由于处理每一位时,可以使用稳定的排序算法,如计数排序,因此基数排序本身也是稳定的。基数排序的时间复杂度是线性的,即O(kn),其中k是数字的最大位数,n是数字的数量,特别适合于处理大量整数的排序。 **希尔...

    归并排序,基数排序算法比较

    基数排序的过程包括多个计数排序的步骤,每个步骤根据数字的一个位来进行排序,从低位到高位,直至所有位都排序完成。在这个程序中,`Radixsort()`函数实现了基数排序,它通过计算每个位的频率(`count[]`数组),并...

    基数排序radix sort

    排序算法中的基数排序,更重要的是会算时间复杂度,基数排序可以说是以计数排序位基础的,只不过变成了一位一位来或者一个字节一个字节来,每位或者每个字节都过了一遍,则排序完毕。很简单的程序,在code::block IDE...

    基数排序_RADIXSORT

    下面我们将详细探讨基数排序的两种实现方式:基于计数排序和桶排序的基数排序算法。 1. 计数排序(Counting Sort)基数排序: 计数排序本身是一种非比较型排序,适用于排序非负整数。在基数排序中,我们从最低有效...

    基数排序_基数排序算法_

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,因为它可以避免大量的比较操作,而是通过计数和分配来完成排序。 ...

    各类排序算法实现程序,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    各种排序算法的实现函数:包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。 查找最大最小值函数 findMinMax:在给定数组中查找最大值和最小值。 计算平均值...

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

    本文将详细探讨十种经典的排序算法在C++中的实现,分别是冒泡排序、桶排序、计数排序、堆排序、插入排序、合并排序、快速排序、基数排序、选择排序和希尔排序。 1. **冒泡排序**:冒泡排序是最简单的排序算法之一,...

Global site tag (gtag.js) - Google Analytics