1. 计数排序

原理:
计数排序需要用到桶,其核心是不通过比较来获得数的大小,以桶的方式存数来计数
举例来说,一个数组是{3 2 2 1 3 5},共6个数,那么我们需要准备5个有序桶,即1号桶、2号桶…到5号桶,桶的个数是数组里的最大值,然后我们开始来放数到桶,数为1的让1号桶+1,数为2的让2号桶+1…
此时,1号桶为1,2号桶为2,3号桶为2,4号桶为0,5号桶为1
此时,已经排序完毕

1 2 2 3 3 5

代码:

class CountSort{//数组:1, 5, 6, 7, 1, 5, 3, 9, 4, 1, 2, 2public static void GetResultForCountSort(List<int> arr){//桶的数组List<int> bucket = new List<int>();List<int> vs = new List<int>();//初始化桶for (int i = 0; i <=arr.Max(); i++){bucket.Add(0);}//将数对比在对应的桶内,桶内的计数自加for (int i = 0; i <arr.Count; i++){var t = arr[i];bucket[t]++;}//将桶的计数拿出来,还原成数组for (int i = 0; i < bucket.Count; i++){while (bucket[i]!=0){vs.Add(i);bucket[i]--;}}//打印数组for (int i = 0; i < vs.Count; i++){Console.WriteLine(vs[i]);}}}

2. 基数排序

计数排序有着很多限制,比方说,占用空间大,如果数组里最大值几十万,那么就要有一个长度为几十万的桶数组来计次(元素出现的个数),另外还容易越界,比方超过2^31-1等等

在不比较排序中,除了计数排序,基数排序也是一种,其需要的桶是固定的,十进制固定为10(即0-9),原理是按每个元素的位对应每个桶

原理:
举例:23, 45, 6, 98, 15, 142, 12, 9, 236, 74, 61, 845
默认桶里元素为0,桶里元素大小表示元素某位出现的个数
目的是从小到大排序

  1. 找到位数最多的数,补齐其他元素,少位就补0,比方说,这个数组的位数最多的数是三位数,那么一位数就是00x,二位数就是0xx
  2. 开始找对应的桶,数组从左往右,先从个位出发,比方第一个数是23,个位是3,那么桶下标为3的桶里,元素自增,为1(如果有第二个个位为3的数,那么这个桶再自增,为2);
  3. 个位数在桶里排序好后,从桶里把数依次拿出来,比方说,下标为0的桶里,表示了个位为0的元素,把这些元素放最前面,其他桶依次往后
  4. 随后,拿这些排完个位数的数组根据十位数,再来放桶排序,没有十位的按0算,百位也是如此
  5. 直到排完最大位数

程序:
(基本原理的升级版)
升级之处:
在桶里装好元素后,桶从左往右,将该桶里的值与该桶前一个桶里的值相加,放入该桶
此时桶里的数是小于等于该桶下标的值,比如3号桶,里面有6,那么表示,下标小于等于3的数组元素有6个,此时,我们将数组从右往左拿元素,遇见位数是3的,放在第5位(6-1=5),因为在数组最右边放进去桶的肯定最后一个入桶,也就是6个元素的最后一个,按桶来说的话,是从0开始,第六个数就是第6个桶,按下标就是5

代码:

class Program{static void Main(string[] args){List<int> arr1 = new List<int>() { 23, 45, 6, 98, 15, 142, 12, 9, 236, 74, 61, 845 };RadixSort.GetResultFormRadixSort(arr1);Console.ReadLine();}}//基数排序class RadixSort{//23, 45, 6, 98, 15, 142, 12, 9, 236, 74, 61, 845public static void GetResultFormRadixSort(List<int> arr){//暂存数组List<int> replace = new List<int>() { 0,0,0,0,0,0,0,0,0,0,0,0};//元素的位数var maxBit = GetMaxBit(arr);for (int d = 1; d <= maxBit; d++){//制造桶,桶里面装数字,这些数字是数组中某个元素的某一位的数,所以最多的桶也就是从0-9List<int> bucket = new List<int>() { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };//按轮次依次取元素某位的值for (int i = 0; i < arr.Count; i++){var bit = GetBits(arr[i], d);bucket[bit]++;}//将该桶里的值与该桶前一个桶里的值相加,放入该桶for (int i = 0; i < bucket.Count - 1; i++){bucket[i + 1] = bucket[i] + bucket[i + 1];}//开始比较数组中元素,从右往左比较for (int i = arr.Count - 1; i >= 0; i--){var bit = GetBits(arr[i], d);replace[bucket[bit] - 1] = arr[i];bucket[bit]--;}//将暂存数组replace的数组放入原数组里for (int i = 0; i < replace.Count; i++){arr[i] = replace[i];}}//打印数组for (int i = 0; i < arr.Count; i++){Console.WriteLine(arr[i]);}}//求某数组中元素的最大位数public static int GetMaxBit(List<int> arr){var maxValue = arr.Max();var t = 0;while (maxValue != 0){t++;maxValue = maxValue / 10;}return t;}//求某元素各个位数的值public static int GetBits(int number, int bit){return ((number / ((int)Math.Pow(10, bit - 1))) % 10);}}

算法笔记-桶排序代码与原理、非比较排序、计数排序、基数排序、C#代码相关推荐

  1. 漫画算法笔记 桶排序

    漫画算法笔记 桶排序 #include <iostream> #include <stdlib.h> #include <algorithm> #include & ...

  2. 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序

    文章目录 一.归并排序 1.1 归并排序基础[必会知识] 1.1.1 递归实现 1.1.2 非递归实现 1.2 归并排序优化 1.2.1 小数组使用插入排序 1.2.2 避免多余比较 1.2.3 节省 ...

  3. 【算法笔记】二叉树遍历模板递归+非递归

    目录 前序遍历 递归版本 迭代版本 中序遍历 递归版本 迭代版本 后序遍历 递归版本 迭代版本 二叉树层序遍历 栈的定义  语法注意: Deque<Integer> stack = new ...

  4. 中希尔排序例题代码_超全面分析十大排序算法

    点击上方"零一视界",选择"星标"公众号 资源干货,第一时间送达 作者 | 不该相遇在秋天 责编 | 程序员小吴 前言 本文全长 14237 字,配有 70 张 ...

  5. ❤️十大排序算法详解❤️——可能是你看过最全的,完整版代码

    文章目录 前言 交集排序 冒泡 简单 快速排序 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序 归并排序 二路 多路 非比较类 计数排序 桶排序 基数排序 最后 前言 兄弟们,应上篇 ...

  6. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  7. 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现

    计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...

  8. 《算法笔记》学习 入门篇

    目录 <算法笔记>学习 3.1 简单模拟 例1:[PAT B1001]害死人不偿命的(3n+1)猜想 例2:[PAT B1032]挖掘机技术哪家强 3.2 查找元素 例:[codeup 1 ...

  9. 排序算法---计数排序(java版)

    计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...

最新文章

  1. ERP实施流程---计划部
  2. 主键约束、外键约束、唯一约束、检查约束、默认值约束实例
  3. python-1day
  4. 如何直接soap字符串,访问webservice
  5. 我的docker随笔3:实现加速器,加快拉取镜像速度
  6. python切片长度_python的间隔切片技巧
  7. pscad 如何产生一个阶跃信号_宇宙中第一个量子场是如何产生的?
  8. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
  9. linux下client命令,Linux系统smbclient命令的使用方法
  10. cloudflare-5s盾分析
  11. 来给PPT添加一个进度条和页码吧
  12. echarts 柱状图设置边框_echarts柱状图
  13. 解决postgre报错ERROR #22P02 malformed array literal
  14. 用什么系统搭建nas服务器,自己家里搭建NAS服务器有什么好方案
  15. GNURadio3.9.4创建OOT模块实例
  16. C#,精巧实用的代码,图片生成裸眼3D立体图像的源代码
  17. Java基础——IO流
  18. VS2017、WPF使用报表工具RDLC完成报表,打印预览和直接打印
  19. IO之 java中BIO NIO AIO原理、区别以及应用
  20. 目标Zookeeper未授权访问(漏洞验证)

热门文章

  1. 非计算机专业毕业论文用游戏,计算机专业大学生毕业论文
  2. 安全测试之XSS攻击
  3. 数据泄露频繁,背后原因之--数据的利益
  4. Node:非IO的异步API
  5. 权威预测:2018年这十大数字化转型趋势要火!
  6. Java Web 程序员的发展趋势分析
  7. 学习笔记之三(数组中的一些方法)
  8. 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。
  9. Remove Nth Node From End of List leetcode java
  10. Java Bad version