一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : 3435673055@qq.com

 Time of completion:2023.3.1
Last edited: 2023.3.1

导读:

帮助算法设计初学者快速掌握算法设计,帮助安静对ABCD……等的重要性排序更清晰!

目录

算法设计与分析—十大经典排序算法二(6--10)

第6关:快速排序

参考代码

第7关:堆排序

参考代码

第8关:计数排序

参考代码

第9关:桶排序

参考代码

第10关:基数排序

参考代码

作者有言


算法设计与分析——十大经典排序算法二(6--10)

第6关:快速排序

任务描述

本关任务:实现快速排序算法,并将乱序数列变成升序。

相关知识

为了完成本关任务,你需要掌握:1.快速排序算法。

快速排序算法

快速排序是最常用的一种排序算法,它的特点是速度快、效率高。快速排序的基本思想:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素作为基准值。

  • 算法步骤:

    1. 从数列中挑出一个元素,称为基准pivot

    2. 分区partition操作:比基准值小的元素放在左边,比基准值大的元素放在右边;

    3. 递归recursive:把小于基准值元素的子数列和大于基准值元素的子数列分别递归排序。

编程要求

本关的编程任务是补全右侧代码片段partition_arrayquick_sortBeginEnd中间的代码,具体要求如下:

  • partition_array中,实现数组分区:选定一个基准,左边比基准小,右边比基准大,返回基准所处位置。
  • quick_sort中,实现快速排序:自上而下的递归方法。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 2 3 4 5 6 7 8 9 10

测试输入:

15

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48

预期输出:

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

参考代码

#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int partition_array(int *arr ,int l,int r){int a = arr[l];int q = l;int e = r;while(q != e){while(e > q && arr[e]>= a){e--;}while(e > q && arr[q] <= a){q++;}if(q < e){swap(arr[q],arr[e]);}}arr[l]= arr[q];arr[q] = a;return q;
}int* quick_sort(int *arr, int l, int r)
{if(l<r){int a = partition_array(arr ,l,r);quick_sort(arr,l , a);quick_sort(arr, a+1, r);return arr;}
}

第7关:堆排序

任务描述

本关任务:实现堆排序算法,并将乱序数列变成升序。

相关知识

为了完成本关任务,你需要掌握:1.堆排序算法。

堆排序算法

堆排序Heapsort是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

  • 算法步骤:

    1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

    2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n]

    3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

编程要求

本关的编程任务是补全右侧代码片段adjustHeapheap_sortBeginEnd中间的代码,具体要求如下:

  • adjustHeap中,实现堆的调整。
  • heap_sort中,构建大顶堆,并调用adjustHeap实现堆的调整。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 2 3 4 5 6 7 8 9 10

测试输入:

15

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48

预期输出:

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

参考代码

#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}void adjustHeap(int *arr, int param1, int j)
{int a = arr[param1]; int child = 2*param1 + 1; while(child < j){if(child + 1 < j && arr[child] < arr[child+1 ])child++;if(a >= arr[child])break;arr[param1] = arr[child];param1 = child;child = 2*child +1;}arr[param1] = a;
}int* heap_sort(int *arr, int n)
{for(int i = n / 2 - 1; i >= 0; i --)adjustHeap(arr, i, n);for(int i = n - 1; i > 0; i --){swap(arr[0],arr[i]);adjustHeap(arr,0, i);}return arr;
}

第8关:计数排序

任务描述

本关任务:实现计数排序算法,并将乱序数列变成升序。

相关知识

为了完成本关任务,你需要掌握:1.计数排序算法。

计数排序算法

计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

  • 算法步骤:

    1. 找出待排序的数组中最大和最小的元素;

    2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;

    3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);

    4. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

编程要求

本关的编程任务是补全右侧代码片段sort_arrayBeginEnd中间的代码,具体要求如下:

  • sort_array中,实现计数排序算法,完成指定输出。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 1

2 1

3 1

4 1

5 1

6 1

7 1

8 1

9 1

10 1

1 2 3 4 5 6 7 8 9 10

参考代码

#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}void sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max<arr[s])max=arr[s];int min = 0x3f3f3f3f;for(s=0;s<n;s++)if(min>arr[s])min=arr[s];int arrLen = max-min+1;int *jishu = new int[arrLen];fill(jishu, jishu + arrLen, 0);for(int i = 0; i < n; i ++)jishu[arr[i] - min] += 1;int index = 0;for(int i = 0; i < arrLen; i ++)if(jishu[i] != 0)printf("%d %d\n", i + min, jishu[i]);for(int i = 0; i < arrLen; i ++)while(jishu[i] != 0){arr[index] = i+min;jishu[i] --;index ++;}print_array(arr, n);
}

第9关:桶排序

任务描述

本关任务:实现桶排序算法,并将乱序数列变成升序。

相关知识

为了完成本关任务,你需要掌握:1.桶排序算法。

桶排序算法

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

  • 算法步骤:

    1. 设置一个定量的数组当作空桶;

    2. 遍历输入数据,并且把数据一个一个放到对应的桶里去;

    3. 对每个不是空的桶进行排序;

    4. 从不是空的桶里把排好序的数据拼接起来。

编程要求

本关的编程任务是补全右侧代码片段sort_arrayBeginEnd中间的代码,具体要求如下:

  • sort_array中,实现桶排序算法,并返回升序的数组。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 2 3 4 5 6 7 8 9 10

测试输入:

15

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48

预期输出:

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

参考代码

#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int* sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max<arr[s])max=arr[s];int min = 0x3f3f3f3f;for(s=0;s<n;s++)if(min>arr[s])min=arr[s];int bucketNum = (max - min) / n + 1;int *bucket = new int[bucketNum * n];int *bucketIndex = new int[bucketNum];fill(bucketIndex, bucketIndex + bucketNum, -1);for(int i = 0; i < n; i ++){int index = arr[i] / (n + 1);bucketIndex[index] ++;bucket[index * n + bucketIndex[index]] = arr[i];}for(int i = 0; i < bucketNum; i ++)if(bucketIndex[i] != -1)sort(bucket + i * n, bucket + i * n + bucketIndex[i] + 1);int index = 0;for(int i=0;i<bucketNum;i++){int a = 0;while(bucketIndex[i]>=0){arr[index] = bucket[i*n + a];a++;index++;bucketIndex[i]--;}}return arr;
}

第10关:基数排序

任务描述

本关任务:实现基数排序算法,并将乱序数列变成升序。

相关知识

为了完成本关任务,你需要掌握:1.基数排序算法。

基数排序算法

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

  • 算法步骤:

    1. 取得数组中的最大数,并取得位数;

    2. arr为原始数组,从最低位开始取每个位组成radix数组;

    3. radix进行计数排序(利用计数排序适用于小范围数的特点);

编程要求

本关的编程任务是补全右侧代码片段sort_arrayBeginEnd中间的代码,具体要求如下:

  • sort_array中,实现基数排序算法,并返回升序的数组。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 2 3 4 5 6 7 8 9 10

测试输入:

15

3 44 38 5 47 15 36 26 27 2 46 4 19 50 48

预期输出:

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

参考代码

#include "sort_.h"void print_array(int *arr, int n)
{if(n==0){printf("ERROR: Array length is ZERO\n");return;}printf("%d", arr[0]);for (int i=1; i<n; i++) {printf(" %d", arr[i]);}printf("\n");
}int* sort_array(int *arr, int n)
{int max = 0, s;for(s = 0; s < n; s ++)if(max < arr[s])max = arr[s];int *radix = new int[n * 10];fill(radix, radix + n * 10, 0);int *tmparr = new int[n];for(int i = 0; i < n; i ++)tmparr[i] = arr[i];int jishu[10];fill(jishu, jishu + 10, -1);int wei = 0;while(max > 0) max /= 10, wei ++;for(int i=1;i<=wei;i++){int dev = 1;for(int j = 1; j < i; j ++)dev *= 10;for(int j = 0; j < n; j ++){int index = arr[j] / (dev) % (10);jishu[index] ++;radix[index * n + jishu[index]] = arr[j];}int ind = 0;for(int k = 0; k < 10; k ++)if(jishu[k] >= 0){sort(radix + k * n, radix + k * n + jishu[k] + 1);for(int j = 0; j < jishu[k] + 1; j ++)arr[ind] = radix[k * n + j], ind ++;jishu[k] = -1;}fill(radix, radix + n * 10, 0);}return arr;
}

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

算法设计与分析——十大经典排序算法二(6--10)相关推荐

  1. 算法设计与分析——十大经典排序算法一(1--5)

    目录 算法设计与分析--十大经典排序算法 第1关:冒泡排序 参考代码 第2关:选择排序 参考代码 第3关:插入排序 参考代码 第4关:希尔排序 参考代码 第5关:归并排序 参考代码 作者有言 一个不知 ...

  2. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  3. 十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 ...

  4. 一文搞定十大经典排序算法

    更多内容关注公众号:SAP Technical 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间 ...

  5. 一文搞掂十大经典排序算法

    一文搞掂十大经典排序算法 今天整理一下十大经典排序算法. 1.冒泡排序 --越小的元素会经由交换慢慢"浮"到数列的顶端 算法演示 算法步骤 比较相邻的元素.如果第一个比第二个大,就 ...

  6. 十大经典排序算法及比较与分析 ( 动画演示 ) ( 可视化工具 )

    可视化工具及动画展示:旧金山大学 (usfca)|数据结构可视化工具 排序算法概念及描述:1.0 十大经典排序算法(文章部分内容引用自改文章) 参考:邓俊辉 的数据结构 本文未对排序算法概念进行详细说 ...

  7. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  8. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  9. 【GIF动画+完整可运行源代码】C++实现 堆排序——十大经典排序算法之七

    十大经典排序算法系列博客-->传送门 堆排序Heapsort是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大 ...

最新文章

  1. C/C++ VS java
  2. linux中普通用户用友所有权限,linux文件的特殊权限
  3. C语言实现hash/DJB2算法(附完整源码)
  4. 处女座|处女座性格分析
  5. YBTOJ:公共子串(KMP)
  6. Windows Gadget 制作二
  7. php插入方法,有什么办法能把一条php语句插入到方法里呢?
  8. 真牛!打开mysql
  9. jquery. Validator验证框架ajax返回json数据
  10. Springboot thymeleaf i18n国际化多语言选择
  11. 电脑无法安装SecoClient
  12. 德软件开发者否认蓄意植入“心血”安全漏洞
  13. 如何把PDF文件拼接成一个?
  14. 和计算机相关的英文名字女孩,简单好听寓意好的英文名字女孩
  15. QuartusII 15.0 中解决仿真报错 Error : vism-19 Faild to access library问题
  16. 【转】如何使用visual studio将你的程序打包成安装包
  17. IJCAI'22 | 感知图像内容的创意布局自动生成方法
  18. [软件人生]写书与程序员
  19. 软件工程师的本手、妙手和俗手
  20. 王者荣耀服务器维护多久12.4,王者荣耀12月4日维护新活动介绍 王者荣耀维护到几点...

热门文章

  1. Bash脚本之if-then语句
  2. 微软“造车”提上日程,阿里为什么还没行动?
  3. Windows Live
  4. Python基于YOLOv5的交通标志识别系统[源码]
  5. 电路方案分析(四)无线充电电动牙刷原理图分析
  6. 使用OrgChart插件生成家谱组织结构图
  7. Android开发自学笔记—1.1(番外)AndroidStudio常用功能介绍
  8. for循环语句例题及解析python_Python中for循环控制语句用法实例
  9. Ubuntu网卡配置(真)
  10. 鸿蒙系统需要绑定银行卡吗,微众银行APP开户遇到的常见问题