【数据结构-排序】4.图解归并排序和基数排序
归并排序
排序思想
归并排序就是将两个或两个以上的有序表组合成一个新的有序表
从代码结构来看,归并排序类似树的后序遍历 —— (参考快速排序,类似树的先序遍历)
归并排序算法分析
归并排序的时间复杂度是 O(nlogn)
,由于我采用的方式是下标元素的交换,所以没有用到辅助空间,因此空间复杂度是 O(1)
,同时也是 稳定排序, 由于它是一种分治思想,所以它的元素 不是全局有序 的。
代码实现
class Solution{
public:int counter = 0;int ans[7] = {23,76,34, 89, 90,34,56};void mergeSort(int low, int high) {if(low>=high) return;int mid = (low + high) / 2;mergeSort(low,mid);mergeSort(mid+1,high);mergeTwoList(low,mid,high);return;}
private:void mergeTwoList(int low, int mid, int high) {int i = low;int j = mid+1;int tmp[10] = {0};int flag = low;while(i<=mid&&j<=high) {if(ans[i]<ans[j]) {tmp[flag++] = ans[i++];} else {tmp[flag++] = ans[j++];}}while(i<=mid) tmp[flag++] = ans[i++];while(j<=high) tmp[flag++] = ans[j++];for(int k = low; k <= high; k++) {ans[k]=tmp[k];}return;}
};
加工后执行的结果
基数排序
排序思想
基数排序不基于比较进行排序,而是采用多关键字的排序思想。也就是说基数排序实际上是关于关键字各位的的大小排序的。
通过示例解释一下
以下 nums[0,6]
的个位数依次为 {6, 6, 4, 9, 0, 4, 6}
,按这个依据从小到大排序,{90, 34, 34, 6, 76, 56, 189}
以上 nums[0,6]
的十位数依次为 {9, 3, 3, 0, 7, 5, 8}
,按这个依据从小到大排序,{6, 34, 34, 56, 76, 189, 90}
以上 nums[0,6]
的百位数依次为 {0, 0, 0, 0, 0, 1, 0}
,按这个依据从小到大排序,{6, 34, 34, 56, 76, 90, 189}
基数排序算法分析
基数排序的时间复杂度是 O(dn)
,也就是需要精心 d
趟分配,一趟分配和收集需要 O(n)
,空间复杂度是 O(10n)
,同时也是 稳定排序, 但 不是全局有序 的。
代码实现
class Solution{
public:void radixSort(vector<int> nums) {vector<vector<int> > tmp;vector<int> list;int anchor = 1;int counter = 0;// lgchor + 1趟排序while(anchor) {tmp.clear();// 需要辅助数列for(int j = 0; j < 10; j++) {list.clear();list.push_back(j);tmp.push_back(list);}int i = 0; // 按关键字各个位数排序while(i<7) {int rest = nums[i] % (anchor * 10);int radix = rest / anchor;tmp[radix].push_back(nums[i++]);}// 放在一个列表中nums.clear();for(int j = 0; j < 10; j++) {for(int k = 1; k < tmp[j].size(); k++) {nums.push_back(tmp[j][k]);}if(tmp[j].size()==7) anchor=0;} anchor *= 10;}return;}
};
加工后执行的结果
归并排序测试代码
#include <stdio.h>
#include <vector>
using namespace std;class Solution{
public:int counter = 0;int ans[7] = {23,76,34, 89, 90,34,56};void mergeSort(int low, int high) {if(low>=high) return;int mid = (low + high) / 2;mergeSort(low,mid);mergeSort(mid+1,high);mergeTwoList(low,mid,high);printf("第%d轮:", counter++);for(int j = 0; j < 7; j++) {printf(" %d ",ans[j]);if(j!=6) printf(",");}printf("\n");return;}
private:void mergeTwoList(int low, int mid, int high) {int i = low;int j = mid+1;int tmp[10] = {0};int flag = low;while(i<=mid&&j<=high) {if(ans[i]<ans[j]) {tmp[flag++] = ans[i++];} else {tmp[flag++] = ans[j++];}}while(i<=mid) tmp[flag++] = ans[i++];while(j<=high) tmp[flag++] = ans[j++];for(int k = low; k <= high; k++) {ans[k]=tmp[k];}return;}
};int main() {Solution solution;solution.mergeSort(0,6);return 0;
}
基数排序测试代码
#include <stdio.h>
#include <vector>
using namespace std;class Solution{
public:void radixSort(vector<int> nums) {vector<vector<int> > tmp;vector<int> list;int anchor = 1;int counter = 0;while(anchor) {tmp.clear();for(int j = 0; j < 10; j++) {list.clear();list.push_back(j);tmp.push_back(list);}int i = 0; // 第一轮排序while(i<7) {int rest = nums[i] % (anchor * 10);int radix = rest / anchor;tmp[radix].push_back(nums[i++]);}// 放在一个列表中nums.clear();for(int j = 0; j < 10; j++) {for(int k = 1; k < tmp[j].size(); k++) {nums.push_back(tmp[j][k]);}if(tmp[j].size()==7) anchor=0;} anchor *= 10;printf("第%d轮:", counter++);for(int j = 0; j < nums.size(); j++) {printf("%d",nums[j]);if(j!=nums.size()-1) printf(",");}printf("\n");}return;}
};int main() {vector<int> v;v.push_back(6);v.push_back(76);v.push_back(34);v.push_back(189);v.push_back(90);v.push_back(34);v.push_back(56);Solution solution;solution.radixSort(v);return 0;
}
【数据结构-排序】4.图解归并排序和基数排序相关推荐
- 数据结构排序算法之归并排序(c语言实现)
博主身为大二萌新,第一次学习数据结构,自学到排序的时候,对于书上各种各样的排序算法顿觉眼花缭乱,便花了很长的时间尽力把每一个算法都看懂,但限于水平有限,可能还是理解较浅,于是便将它们逐个地整理实现出来 ...
- 数据结构期末复习之归并排序和基数排序
归并排序 基数排序 总结:
- 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序
排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...
- 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)
本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...
- 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...
- 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序
第八章 快速排序.归并排序和基数排序 文章目录 第八章 快速排序.归并排序和基数排序 一.快速排序 1.基本介绍 2.代码实现 二.归并排序 1.基本介绍 2.代码实现 三.基数排序 1.基本介绍 2 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- 插入排序、希尔排序(Shell)、选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序(桶排)的 时间复杂度和空间复杂度
插入排序 希尔排序(Shell) 选择排序 堆排序 冒泡排序 快速排序 归并排序和基数排序(桶排) 的 时间复杂度(平均情况.平均情况和最坏情况)和 空间复杂度. 排序方法 名称 是否需要 比较关键字 ...
- 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. 2)外部排序:数据量过大,无法全部加载到内存中,需要 ...
最新文章
- 意见征集,世界AI智商评测量标准2018年新版讨论方案
- instagram api java_如何在没有用户交互的情况下获得instagram access_token(新api)?...
- css中em单位详解,说明
- 服务器如何开启远程控制,远程控制命令设置方法介绍
- c# mongodb or查询_C# 查询MongoDB中的数据
- SpringDay01
- oracle基本的操作
- webpack 初学笔记
- java二级题库软件_无忧考吧二级JAVA超级模拟软件
- 三角网导线平差实例_三角网间接平差示例
- SI4463实验笔记
- AT91SAM9260使用SAM-BA调试BOOT程序
- 像素深度、分辨率与图片大小的关系?图片大小怎么计算?
- 《世界棒球》:黑人联盟
- python获取erp数据_python自学之路-数据读取
- flv.js php,flv.js的使用详解
- android 监测属性值变化,Android 的系统属性(SystemProperties)分析 | Bob's Blo...
- 浅谈spring之jdk动态代理
- UE5 官方案例Lyra 全特性详解 11.背包系统Inventory System 0
- 魔兽1.20e MH