排序算法——计数排序
来源:互联网 发布:zdm软件绘制纵断面 编辑:程序博客网 时间:2024/05/16 14:18
之前看的都是比较排序算法,通过两个数大小的比较来进行比较。计数排序是一种线性排序算法,不用进行比较。基本思想是对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。算法导论第三版109页,讲解非常清楚。这里把其中的一个图贴上来,便于理解
图中,数组A是待排序的数组,C是用来临时存放信息的数组,B是最终排好序的数组。对于A中的每一个元素,我们将其元素作为C数组的下标。直白的说,如a中,C[0]=2表示A中的元素为0的有两个,C[1]=0,表示A数组中没有值为1的元素,以此类推。所以C[i]中存放的是A中i的个数。b图是对数组前面的数字相加后的结果,如C[2]=4表示,A中小于等于2的元素有4个。以此类推。
得到A和C之后,就可以开始排序了。如A[1]=2,我们由C数组知道,小于等于2的元素有4个,所以排好序的数组中,2应该放在数组的第4位。图中是从后往前的。比如A[8]=3,由C知道,数组A中小于等于3的元素有7个,因此B[7]=3.以此类推这样排下去……
【特别注意】由于数组中可能会有相等的元素,因此在排序后,要记得C中对应部分减1
下面是我写的代码:
#include<iostream>#include<iomanip>#include <iostream>#include <stdio.h>#include <string.h>#include <list>using namespace std;void CountSort(int a[], int n)//C大小以内的数排序,这里c的值为1000,数组个数也在1000以内{int b[1000] = { 0 };int c[1000] = { 0 };for (int i = 0; i < n; i++){int ai = a[i];c[ai] = c[ai] + 1;}for (int i = 1; i < 1000; i++){c[i] = c[i] + c[i - 1];}for (int i = 0; i < n; i++){b[c[a[i]]] = a[i];//注意下标c[a[i]]--;}for (int i = 0; i < n; i++){cout << b[i] << " ";}}//计算排序的实现int main(){int a[8] = {2,5,3,0,2,3,0,3};CountSort(a,8);return 0;}
0 0
- 算法导论—计数排序
- 排序算法——计数排序
- 排序算法——计数排序 收藏
- 排序算法——计数排序
- 算法——排序之计数排序
- 排序算法——计数排序
- 排序算法——计数排序
- 经典算法——计数排序算法
- 常用排序算法——插入排序,快速排序,归并排序,堆排序,计数排序
- 排序算法:计数排序
- 排序算法-计数排序
- 【排序算法】计数排序
- 【排序算法】:计数排序
- 小白学算法2.8——计数排序
- 算法导论例程——计数排序
- 算法分析之——计数排序
- 算法导论笔记——计数排序
- 【算法理解】——计数排序
- UML简单介绍(二十四)——基于UML的软件设计总结
- tcpdump 取消限制包大小
- 05 Java JUC 中的 Executor 框架 提交线程
- centos 修改网卡
- 要看的书
- 排序算法——计数排序
- 07 Java JUC 中的 Executor 框架 周期性任务调度
- [欧拉函数]Bzoj2705 Longge的问题[SDOI2012]
- 类,对象。包
- 20146月份到2015年5月份70个大中城市住宅销售价格变动情况
- 注册DLL的方法!
- 随机过程
- 08 Java JUC 中的 ThreadPoolExecutor
- java.lang.RuntimeException: Unable to start activity ComponentInfo{包名/类名}