算法精解---计数排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NR(x) sizeof(x)/sizeof(x[0])

//计数排序
//排序成功返回0,否则返回-1
//局限:只能用于整型或者那些可以用整型来表示的数据集合
//优点:速度快,稳定 

/*
	利用计数排序将数组data中的整数进行排序。
	data中的元素个数由sized决定。
	参数k为data最大的整数加1,当ctsort返回时,k为data中最大的整数加1
	复杂度:O(n+k) , N为要排序的元素个数,k为data中最大的整数加1
*/
int ctsort(int *data, int size, int k)
{

	int   *counts,*temp;
	int   i,j;
	if ((counts = (int *)malloc(k * sizeof(int))) == NULL)
	   return -1;
	if ((temp = (int *)malloc(size * sizeof(int))) == NULL)
	   return -1;
	for (i = 0; i < k; i++)
	   counts[i] = 0;
	for (j = 0; j < size; j++)
	   counts[data[j]] = counts[data[j]] + 1;
	for (i = 1; i < k; i++)
	   counts[i] = counts[i] + counts[i - 1];
	for (j = size - 1; j >= 0; j--) {
	   temp[counts[data[j]] - 1] = data[j];
	   counts[data[j]] = counts[data[j]] - 1;
	}

	memcpy(data, temp, size * sizeof(int));
	free(counts);
	free(temp);
	return 0;
}

int main(void)
{
    int buffer[10] = {1,3,2,7,4,8,9,22,12,13} ;
    int i ;
	ctsort(buffer , NR(buffer) ,23) ;
	for(i = 0 ; i < NR(buffer) ; i++)
		printf("buffer[%d]:%d\n",i,buffer[i]) ;
    return 0 ;
}

运行结果:

buffer[0]:1
buffer[1]:2
buffer[2]:3
buffer[3]:4
buffer[4]:7
buffer[5]:8
buffer[6]:9
buffer[7]:12
buffer[8]:13
buffer[9]:22

--------------------------------
Process exited after 0.04599 seconds with return value 0
请按任意键继续. . .

时间: 2024-10-11 00:26:23

算法精解---计数排序的相关文章

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

非基于比较的排序算法之一:计数排序

计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值小于等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置. 限制:所有值得取值范围不能太大,并且需要知道确切的取值范围.本算法需要的辅助空间要求较高. 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 现在给出C#实现的计数排序(counting sort) public vo

算法笔记_129:计数排序(Java)

目录 1 问题描述 2 解决方案 2.1比较计数排序 2.2 分布计数排序   1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列. 2 解决方案 2.1比较计数排序 下面算法的时间复杂度为O(n^2),空间复杂度为O(n).此方法对于任意一组数据均可排序. 具体代码如下: package com.liuzhen.practice; public class Main { public void comparisonCountingSort(int[] A) { int[

Hark的数据结构与算法练习之计数排序

算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定性而做的数据累加,大家听我说说就知道了: 1.首先,先取出要排序数组的最大值,假如我们的数组是int[] arrayData = { 2, 4, 1, 5, 6, 7, 4, 65, 42 };,那么最大值就是65.(代码17-21行就是在查找最大值) 2.然后创建一个计数数组,计数数组的长度就是我

《算法精解 C语言描述》

算法设计的一般方法 随机法依赖于随机数的统计特性.一个应用随机法的例子是快速排序. 分治法 动态规划 贪心法 近似法——旅行商问题 指针 在C语言中,通常声明一个void指针来表示泛型指针. 对于泛型指针来说类型转换非常重要,因为只有告诉泛型指针通过何种类型来访问地址时,泛型指针才能正确取到值.这是由于泛型指针不会告诉编译器它指向的是何种类型数据,因此编译器不知道多少个字节要被访问.也不知道应该如何解析字节. 函数指针是指向可执行代码段或调用可执行代码段的信息块的指针. 例如,在下面一段代码中,

算法精解(三)——归并排序

归并排序 O(NlogN),所以归并排序最坏情况能够达到快速排序的平均水准 需要额外的存储空间O(n) 1.对数据不断的分割,直到剩下一个一个的 2.合并数据,在合并的时候,其实是两个有序的数组,因此 这个过程是两个有序数组进行合并排序 /<span id="_xhe_cursor"></span>/ 归并排序 // O(NlogN),所以归并排序最坏情况能够达到快速排序的平均水准 // 需要额外的存储空间O(n) // 1.对数据不断的分割,直到剩下一个一个的

算法精解(一)——插入排序

<pre name="code" class="cpp"><span style="background-color: rgb(255, 255, 255);">// 插入排序 // // O(n^2),在递增序列插入1个元素时,O(n) #include "sort.h" void issort(void *data, int size, int esize, int (*compare)(const

算法精解:最小二乘法C实现

计量经济学研究的直接目的是确定总体回归函数Yi=B1+B2Xi+ui,然而能够得到的只是来自总体的若干样本的观测值,要用样本信息建立的样本回归函数尽可能"接近"地去估计总体回归函数.为此,可以以从不同的角度去确定建立样本回归函数的准则,也就有了估计回归模型参数的多种方法. 最小二乘估计法用来确定函数y(x) = b1x + b0 中b1和b0的估计值. y(x)是n个点(x0,y0) , ... (Xn-1 , Yn-1)的最佳拟合线. b1 = (n * sigma(Xi * Yi)

算法 计数排序

参考博客:常用排序算法总结(二) 计数排序 counting sort 1.计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值.计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法.但计数排序局限性比较大,只限于对整数进行排序.计数排序是消耗空间发杂度来获取快捷的排序方法,其空间发展度为O(K)同理K为要排序的最大值. 2.计数排序的基本思想为一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置