基数排序

排序算法 - 基数排序

為{幸葍}努か 提交于 2019-11-27 11:03:45
基本思想 基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。 数组下标从0-9,每个数组元素是一个链表 比如对一些三位数以内的树排序,先将个位的数值插入对应的下标的链表中,然后再放回原数组,放回的顺序和插入的顺序一致,将链表清空,再将十位的数字插入对应的下标的链表中,依次操作,最终数组中的数据便以完成排序。 算法代码 1 //基数排序 2 int GetKey(int value, int k) //获取一个数的第k位数字 3 { 4 int key; 5 while (k > 0) 6 { 7 key = value % 10; 8 value /= 10; 9 k--; 10 } 11 return key; 12 } 13 14 void Distribube(int *arr, int n, int k, list<int> *lists) //分配 15 { 16 for (int i = 0; i < n; ++i) 17 { 18 int index = GetKey(arr[i], k); 19 lists[index].push_back(arr[i]); 20 } 21 } 22 23 void Collect(int *arr, list<int> *lists) //收集 24 { 25 int index = 0; 26

基数排序

旧巷老猫 提交于 2019-11-26 17:47:19
原理 基数排序是一种非比较的排序算法,它是以桶排序为基础的。 这样排序的原因是因为觉得按高位排序,高位影响大,做出的变动更多,而从低位开始排序,低位影响小,做出的变动小。 #include <iostream> #include <vector> #include <string> using namespace std; //最大位数 int maxbit(vector<int> arr){ int len=0; for(auto x:arr){ int count=0; while(x>0){ x/=10; c++; } if(len<count) len=count; } return len; } /*基于int型数组的基数排序简单实现*/ void radixsort(vector<int> &arr){ const buckets_number=10; vector<vector<int> > buckets(10);//10个桶,每个桶是vector<int> int len = maxbit(arr); int r=1; for(int i=0;i<len;i++){ for(int x:arr){ int tmp=x/r; int index = tmp%buckets_number; buckets[index].push_back(x); } int i=0;

5分钟了解基数排序

南楼画角 提交于 2019-11-26 13:23:14
5分钟了解基数排序 前言 基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序。基数排序分为两种:第一种是LSD ,从最低位开始排序;第二种是 MSD, 从最高位开始排序。 。 基数排序思想介绍 分配:对于数字,每位的取值范围是0-9,因此需要10个容器(我们可以将其称为桶),这10个桶标号为0-9。每趟排序时,我们取每一个元素在该位的数值依次放入桶中。 2. 收集:在一趟排序完成后,我们按顺序从0-9的桶中依次取元素。 3. 继续进行分配和收集,直到最大位数排序完成。 算法说明: 待排序数据:12, 34, 2, 123, 25, 59, 37 采用LSD,从低位开始排序 第一轮:取个位数,放入对应的桶,比如12的个位数是2,放到2号桶;34的个位数是4,放到4号桶 0 1 2 12 2 3 123 4 34 5 25 6 7 37 8 9 59 第一轮后,得到数据:12, 2, 123, 34, 25, 37, 59 第二轮:取十位数,放入桶中。比如2,十位数是0,放到0号桶 0 2 1 12 123 2 25 3 34 37 4 5 59 6 7 8 9 第二轮后,得到数据:2, 12, 123, 25, 34, 37, 59 第三轮:取百位数,放入桶 0 2 12 25 34 37 59 1 123 2 3 4 5 6 7 8 9 最后,得到有序数据 2,

十大经典排序算法的算法描述和代码实现

谁说胖子不能爱 提交于 2019-11-26 04:48:51
这里详细讲解了十大经典算法的分类,例如交换排序、插入排序、选择排序等比较类排序,以及计数排序、桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现。对冒泡排序、插入排序、选择排序和堆排序等十种算法进行了详细的思想总结。 一、算法概述 1、算法分类 十种常见排序算法可以分为两大类: (1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序。 (2)非比较类排序:不通过比较元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 2、算法复杂度 3、相关概念 (1)稳定 如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 (2)不稳定 如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 (3)时间复杂度 对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 (4)空间复杂度 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 二、排序算法的代码实现 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

基数排序

喜夏-厌秋 提交于 2019-11-25 19:47:17
基数排序 介绍 1887年赫尔曼喝了礼发明的 基数排序是桶排序的扩展 实现思路 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。 应用实例 初始状态:53,3,542,748,14,214,使用基数排序,进行反序排序。 根据0-9,对应10个桶 轮数取决于最大数的位数 排序 第一轮排序:将每个元素的个位取出,然后看这个数应该放在哪个对应的桶(一个一维数组)比如,53,个位为3,放在标号为3的桶。3,放在标号为3的桶,放在53的下面,后面一次类推。然后,按照桶的顺序,依次取出数据,放入原来数组。54,2,53,3,14,214,748 第二轮排序:将每个元素的十位取出,按照第一轮排序的规则,进行放入桶(3这个元素,十位没有,视为0),然后桶排序,依次取出数据,放入原来数组,3,14,214,542,748,53 第三轮排序:将每个元素的百位取出,按照第一轮的排序规则,进行放入桶(3这个元素,百位看作0),然后桶排序,依次取出数据,放入原来的数组3,14,53,214,542,748 代码实现 基数排序 时间测试 排序前的时间是 = 2019 - 08 - 06 16 : 49 : 06 排序后的时间是 = 2019 - 08 - 06 16 : 49 : 06 说明