基数排序|RadixSort|C++实现
前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量干货博客汇总
https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482
在本篇博客之外,博主一起拿还做过一篇九大排序的博客,是常用的排序的汇总,里面对每一种排序都有很详细的解释和代码实现(纯C),博主这里也把链接给大家。
【排序】万字九大排序宝藏汇总 轻松拿下九大排序算法【带动画】 (包含超详细的解释和注释)
https://blog.csdn.net/Yu_Cblog/article/details/122848138
基数排序的效率和稳定性
| 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(r) | 稳定 |
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
//基数排序
/*
* 核心思想:
* 1.分发数据
* 2.回收数据
*/
//这是一个多关键字排序
//按照位数多趟分发回收
#define K 3 //最多3位数
#define RADIX 10 //十个基数
#include<queue>
//定义基数
queue<int>Q[RADIX];//这个是队列数组--基数排序要做到先进先出 -- 所以使用队列
//找到key
int GetKey(int value, int k) {
//value:278
//k:0
//代表第一次分发,按照8来排
//所以就把8提取出来就可
int key = 0;
while (k >= 0) {
key = value % 10;
value /= 10;
k--;
}
return key;//比如一个数字时25256 现在按照个位的6来分,key就返回的时6
}
//分发数据
void distribute(int* arr, int left, int right,int k) {
//k代表是第几次分发
for (int i = left; i < right; i++) {//注意这里是左闭右开,所以是<
//根据key分发,key怎么找,用k来找
int key = GetKey(arr[i], k);
Q[key].push(arr[i]);//把arr[i]push到下标为8的队列里面
}
}
void collect(int* arr) {
//不需要区分第几次,只需要把数据回收到数组里面即可
//要检查所有的队列,因为我们不知道哪一些队列有数据哪一些没有
int k = 0;
//arr从0开始重新收集
for (int i = 0; i < RADIX; i++) {
while (!Q[i].empty()) {
//说明这个队列里面有数据
//下面两行其实就是把数据依次放到数组里面去
arr[k++] = Q[i].front();
Q[i].pop();
}
}
}
void _radixSort(int* arr, int left, int right) {
for (int i = 0; i < K; ++i) {//最多循环三次
//有几位数循环几次
//分发数据
distribute(arr, left, right, i);//i代表我现在操作的时哪一位数
//回收数据
collect(arr);
}
}
void radixSort(int* arr, int sz) {
int left = 0;
int right = sz;
//[right,left)
_radixSort(arr, left, right);
}
int main() {
int arr[] = { 278,109,63,930,589,184,505,269,8,83 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++) {
cout << arr[i] << " ";
}
cout << endl;
//
radixSort(arr, sz);
//
for (int i = 0; i < sz; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
基数排序|RadixSort|C++实现的更多相关文章
- 基数排序(RadixSort)
1 基数排序的特点是研究多个关键字key,且多个key之间有权重之分, 或者可把单个key建模为含有多个key的排序 而计数排序.桶排序始终只有个一个key,或者说围绕着一个比较规则 Ex:比较 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 6种基础排序算法java源码+图文解析[面试宝典]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
- Java排序算法总结(转载)
排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*log ...
- C语言实现排序
//C语言版排序#include<stdio.h> #include<stdlib.h> //冒泡排序 void bubleSort(int data[], int n); / ...
- 十大基础排序算法[java源码+动静双图解析+性能分析]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...
- 浅谈后缀数组SA
这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...
随机推荐
- 国内pip源提示“not a trusted or secure host”解决方案
大家应该都知道怎么添加国内pip源(主要是豆瓣和阿里云),~/.pip/pip.conf文件配置大概如下(下面注释掉了豆瓣源): [global] # index-url = http://pypi. ...
- Codeforces Round #619 (Div. 2) A-D
比赛链接:Here 1301A. Three Strings 题意: 给三个相同长的字符串 \(a,b,c\) ,对于每个位置 \(i\) ,你必须做一次操作:交换 \(a_i\) 和 \(c_ ...
- 面试通过,拿到offer了,不去了会怎么样?
接受了offer但不去,其实没啥事,但这属于诚信问题. 这里有个概念,给了offer但不接受,这没事. 给了offer,也接受了,但在入职前一周(或在其它约定的时间范围内)说不去,同时姿态放低些打招呼 ...
- vue中form组件中上传el-upload(单、多附件上传,以及上传回显以及编辑不出现等问题)
https://blog.csdn.net/weixin_46565787/article/details/121934075?spm=1001.2101.3001.6650.2&utm_me ...
- vue-cli3开启gzip压缩
首先添加yarn add 插件 "compression-webpack-plugin" 然后在vue.config.js里引入 在configureWebpack里增加插件代码. ...
- HUD 5773 LIS(最长上升序列)
***关于lower_bound()的用法参见:http://blog.csdn.net/niushuai666/article/details/6734403 lower_bound用法:函数low ...
- STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...
- [转帖]TiKV集群搭建
https://www.cnblogs.com/luohaixian/p/15227788.html 1.准备环境 准备4台ubuntu 16.04虚拟机 部署规划: 节点类型 CPU 内存 存储 部 ...
- [转帖]Skip List--跳表(全网最详细的跳表文章没有之一)
https://www.jianshu.com/p/9d8296562806 跳表是一种神奇的数据结构,因为几乎所有版本的大学本科教材上都没有跳表这种数据结构,而且神书<算法导论>.< ...
- [转帖]Kafka 性能优化与问题深究
Kafka 性能优化与问题深究 一.Kafka深入探究 1.1 kafka整体介绍 1. 1.1 Kafka 如何做到高吞吐.低延迟的呢? Kafka是一个分布式高吞吐量的消息系统,这里提下 Kafk ...