归并排序

排序思想

归并排序就是将两个或两个以上的有序表组合成一个新的有序表

从代码结构来看,归并排序类似树的后序遍历 —— (参考快速排序,类似树的先序遍历

归并排序算法分析

归并排序的时间复杂度是 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.图解归并排序和基数排序相关推荐

  1. 数据结构排序算法之归并排序(c语言实现)

    博主身为大二萌新,第一次学习数据结构,自学到排序的时候,对于书上各种各样的排序算法顿觉眼花缭乱,便花了很长的时间尽力把每一个算法都看懂,但限于水平有限,可能还是理解较浅,于是便将它们逐个地整理实现出来 ...

  2. 数据结构期末复习之归并排序和基数排序

    归并排序 基数排序 总结:

  3. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

    排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...

  4. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  5. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  6. 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序

    第八章 快速排序.归并排序和基数排序 文章目录 第八章 快速排序.归并排序和基数排序 一.快速排序 1.基本介绍 2.代码实现 二.归并排序 1.基本介绍 2.代码实现 三.基数排序 1.基本介绍 2 ...

  7. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  8. 插入排序、希尔排序(Shell)、选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序(桶排)的 时间复杂度和空间复杂度

    插入排序 希尔排序(Shell) 选择排序 堆排序 冒泡排序 快速排序 归并排序和基数排序(桶排) 的 时间复杂度(平均情况.平均情况和最坏情况)和 空间复杂度. 排序方法 名称 是否需要 比较关键字 ...

  9. 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)

    排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. 2)外部排序:数据量过大,无法全部加载到内存中,需要 ...

最新文章

  1. 意见征集,世界AI智商评测量标准2018年新版讨论方案
  2. instagram api java_如何在没有用户交互的情况下获得instagram access_token(新api)?...
  3. css中em单位详解,说明
  4. 服务器如何开启远程控制,远程控制命令设置方法介绍
  5. c# mongodb or查询_C# 查询MongoDB中的数据
  6. SpringDay01
  7. oracle基本的操作
  8. webpack 初学笔记
  9. java二级题库软件_无忧考吧二级JAVA超级模拟软件
  10. 三角网导线平差实例_三角网间接平差示例
  11. SI4463实验笔记
  12. AT91SAM9260使用SAM-BA调试BOOT程序
  13. 像素深度、分辨率与图片大小的关系?图片大小怎么计算?
  14. 《世界棒球》:黑人联盟
  15. python获取erp数据_python自学之路-数据读取
  16. flv.js php,flv.js的使用详解
  17. android 监测属性值变化,Android 的系统属性(SystemProperties)分析 | Bob's Blo...
  18. 浅谈spring之jdk动态代理
  19. UE5 官方案例Lyra 全特性详解 11.背包系统Inventory System 0
  20. 魔兽1.20e MH

热门文章

  1. 【自译】八步成为数据科学家
  2. UVM基础之------uvm_port_base
  3. 强碱性食品 高嘌呤食物
  4. “校内”,网进去了谁?
  5. 自然语言处理库——NLTK
  6. 跨链(1) 设计链间的信任
  7. Hyperledger Fabric 链码(3) 生命周期和API
  8. C++ Primer 5th笔记(7)chapter7 类:编译相关
  9. 01. 对称密码——算法
  10. 【Python小程序】必备软件系列之文字识别提取,前台再也不同担心纸质转电子文件啦~