当前位置: 首页 > news >正文

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

目录

算法设计与分析——十大经典排序算法

第1关:冒泡排序

 参考代码

第2关:选择排序

参考代码

第3关:插入排序

 参考代码

第4关:希尔排序

参考代码

第5关:归并排序

 参考代码

作者有言


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

 Time of completion:2023.2.28
Last edited: 2023.2.28

导读:

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

算法设计与分析——十大经典排序算法

第1关:冒泡排序

任务描述

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

相关知识

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

冒泡排序算法

冒泡排序重复地遍历待排序的数列,每次比较两个相邻元素,如果它们的顺序错误就把它们交换。重复地进行遍历直到没有再需要交换时表示数列已经排序完成。

  • 算法步骤:

    1. 比较相邻的元素:若第一个比第二个大,则交换;

    2. 遍历开始第一对到结尾最后一对,执行步骤1

    3. 重复步骤1~2,直到排序完成。

  • 可改进的冒泡排序:第一趟排序之后最后一个元素是最大的,因此下一趟遍历只需执行到倒数第二对。

编程要求

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

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

测试说明

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

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 4 6 7 8 5 2 3 9 10

1 4 6 7 5 2 3 8 9 10

1 4 6 5 2 3 7 8 9 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

预期输出:

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

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

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

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 sort_array(int *arr, int n)
{int i, x, j;for(j = 0; j < n; j ++){for(i = 0; i < n - 1; i ++){if(arr[i] > arr[i + 1]) {x = arr[i];arr[i] = arr[i + 1];arr[i + 1] = x;}}if(j < 3) print_array(arr, n);}print_array(arr, n);
}

第2关:选择排序

任务描述

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

相关知识

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

选择排序算法

选择排序是一种简单直观的排序算法,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  • 算法步骤:

    1. 初始状态:无序序列为R[0,n−1],长度n,有序区为空;

    2. 第i=1,..,n−1趟排序从当前无序区R[i−1,n−1]中选出最小的元素R[k],并将它与无序区的第1个记录R[i−1]交换,则R[0,i−1]变为元素个数增加1的新有序区,R[i,n−1]变为元素个数减少1的新无序区;

    3. n−1趟选择交换后结束。

编程要求

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

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

测试说明

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

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 7 4 6 8 9 5 2 3 10

1 2 4 6 8 9 5 7 3 10

1 2 3 6 8 9 5 7 4 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 44 38 5 47 15 36 26 27 3 46 4 19 50 48

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

2 3 4 5 47 15 36 26 27 44 46 38 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 sort_array(int *arr, int n)
{int len = n;int minIndex, temp;for (int i = 0; i < len - 1; i++) {minIndex = i;for (int j = i + 1; j < len; j++) if (arr[j] < arr[minIndex]) minIndex = j;temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;if (i < 3) print_array(arr, n);}print_array(arr, n);
}

第3关:插入排序

任务描述

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

相关知识

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

插入排序算法

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  • 算法步骤:

    1. 从第一个元素开始,该元素认为已经被排序;

    2. 取下一个元素,在已经排序的元素序列中从后向前扫描;

    3. 如果已排序元素大于新元素,将已排序元素移到下一位置;

    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    5. 将新元素插入到该位置后;

    6. 重复步骤2~5

编程要求

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

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

测试说明

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

以下是平台的测试样例:

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

1 7 4 6 8 9 5 2 3 10

1 4 7 6 8 9 5 2 3 10

1 4 6 7 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

预期输出:

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

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

3 5 38 44 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 sort_array(int *arr, int n)
{int i, j, temp;for(i = 0; i < n - 1; i ++){temp = arr[i + 1];j = i;while(j > -1 && temp < arr[j])arr[j + 1] = arr[j], j --;arr[j + 1] = temp;if (i < 3) print_array(arr, n);}print_array(arr, n);
}

第4关:希尔排序

任务描述

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

相关知识

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

希尔排序算法

希尔排序由Shell在1959年发明,又叫缩小增量排序,是第一个突破O(n2)的排序算法,属于简单插入排序的改进版,会优先比较距离较远的元素。

  • 算法步骤:

    1. 选择一个增量序列T1​,T2​,… ,Tk​,其中Ti​>Tj​,Tk​=1,i>j;

    2. 每趟排序,根据对应的增量Ti​,将待排序列分割成若干子序列,分别对各子序列进行直接插入排序;

    3. 按增量序列个数k,对序列进行k趟排序。

  • 希尔排序实例: 下图的增量序列为:521,第一趟排序将增量为5的子序列进行插入排序,第二趟排序将增量为2的子序列进行插入排序,第三趟将增量为1的子序列进行插入排序,最终完成排序。

  • 希尔排序的核心在于增量序列的设定:

    既可以提前设定好增量序列,也可以动态的定义增量序列。例如序列长度为n,则动态增量为:147...3x+1<n/3

编程要求

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

  • sort_array中,使用增量序列[5, 2, 1]实现希尔排序算法,完成指定输出。

测试说明

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

以下是平台的测试样例:

测试输入:

8

6 10 5 2 4 9 1 7

预期输出:

6 1 5 2 4 9 10 7

4 1 5 2 6 7 10 9

1 2 4 5 6 7 9 10

1 2 4 5 6 7 9 10

测试输入:

10

7 1 4 6 8 9 5 2 3 10

预期输出:

7 1 2 3 8 9 5 4 6 10

2 1 5 3 6 4 7 9 8 10

1 2 3 4 5 6 7 8 9 10

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 i, j, m = 0;for(int gap = 5; gap > 0; gap /= 2) {for(i = gap; i < n; i++) {int num = arr[i];for(j = i - gap; j >= 0 && arr[j] > num; j -= gap)arr[j + gap] = arr[j];arr[j + gap] = num;}if(m < 3){print_array(arr, n);m ++;}}print_array(arr,  n);
}

第5关:归并排序

任务描述

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

相关知识

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

归并排序算法

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,是采用分治法Divide and Conquer的一个非常典型的应用。分Divide:将问题分成一些小的问题然后递归求解;治Conquer:将分的阶段得到的各答案合并在一起。

  • 算法步骤:

    1. 把长度为n的输入序列分成两个长度为n/2的子序列;

    2. 对这两个子序列分别采用归并排序;

    3. 将两个排序好的子序列合并成一个最终的排序序列。

编程要求

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

  • merge_array中,实现两个有序数组arr1arr2合并。
  • merge_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* merge_array(int *arr1, int n1, int* arr2, int n2)
{int* res;res = new int[n1 + n2];int a1 = 0, a2 = 0, index = 0;for (int i = 0; i < n1+n2; i++) if (i < n1) res[i] = arr1[i];else res[i] = arr2[i - n1];sort(res, res + n1 + n2);return res;
}int* merge_sort(int *arr, int n)
{int mid = n / 2;if (mid > 0) {int* arr1 = new int[mid];int n1 = mid, n2 = n - mid;int* arr2 = new int[n2];for (int i = 0; i < n; i++) if (i < mid) arr1[i] = arr[i];else arr2[i - mid] = arr[i];merge_sort(arr1, n1);   merge_sort(arr2, n - mid);     merge_array(arr1, n1, arr2, n2);}else return  merge_array(arr, n, NULL, 0);
}

作者有言

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

相关文章:

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

目录 算法设计与分析——十大经典排序算法 第1关&#xff1a;冒泡排序 参考代码 第2关&#xff1a;选择排序 参考代码 第3关&#xff1a;插入排序 参考代码 第4关&#xff1a;希尔排序 参考代码 第5关&#xff1a;归并排序 参考代码 作者有言 一个不知名大学生&#x…...

六.慕课的冲击:知识何以有力量?

6.1知识就是力量?【单选题】关于技术进步,以下说法错误的是&#xff08; &#xff09;。A、技术进步可以不依靠知识积累B、知识的力量推动技术进步C、技术黑箱换句话说即是天上掉馅饼D、专利保护产生的垄断利润,构成创新动力我的答案&#xff1a;A【判断题】罗伯特索洛认为,技…...

SQL基础

sql基础笔记 DATEDIFF() 函数返回两个日期之间的时间。 DATEDIFF&#xff08;parameter1&#xff0c;parameter2&#xff0c;parameter3&#xff09; parameter1&#xff1a;可为 年月日时分秒或周 parameter2&#xff0c;parameter3&#xff1a;合法的日期 如&#xff1a…...

脏牛复现(CVE2016-5195)

nmap扫描全网段&#xff0c;发现存货主机&#xff0c;ip为192.168.85.141nmap 192.168.85.0/24nmap 扫描端口&#xff0c;发现80端口&#xff0c;访问该网站nmap -p1-65535 192.168.85.141扫描该网站目录&#xff0c;什么也没扫出来 &#xff0c;dirb扫描目录的字典在usr/share…...

Redis源码---内存友好的数据结构该如何细化设计

目录 前言 内存友好的数据结构 SDS 的内存友好设计 redisObject 结构体与位域定义方法 嵌入式字符串 压缩列表和整数集合的设计 节省内存的数据访问 前言 Redis 是内存数据库&#xff0c;所以&#xff0c;高效使用内存对 Redis 的实现来说非常重要而实际上&#xff0c;R…...

获取 本周、本月、本年 的开始或结束时间

获取 本周、本月、本年 的开始或结束时间 public class DateTimeUtil{// 获取 本周、本月、本年 的开始或结束时间/// <summary>/// 获取开始时间/// </summary>/// <param name"TimeType">Week、Month、Year</param>/// <param name&quo…...

算法训练营 day58 动态规划 判断子序列 不同的子序列

算法训练营 day58 动态规划 判断子序列 不同的子序列 判断子序列 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而…...

优思学院|DFMEA是全球制造业的必修课!

DFMEA&#xff08;Design Failure Mode and Effects Analysis&#xff09;是一种分析技术&#xff0c;在产品设计的早期阶段识别和解决潜在的失效问题。它通过分析设计的各个方面&#xff0c;识别潜在的失效模式和影响&#xff0c;并提出相应的改进措施&#xff0c;以减少失效的…...

【Day02数据结构 空间复杂度】

最近太忙了都好久没有更新博客了,太难了,抽空水一篇文章,大佬们多多支持. 上篇:时间复杂度分析 目录 前言 一、空间复杂度概念&#xff1f; 二、实例展示 三、.有复杂度要求的算法题练习 1.题目链接&#xff1a;力扣--消失的数字 2.题目链接&#xff1a;力扣--旋转数组 总结: 1…...

多数据库管理工具哪家强?ChatGPT点评,第一位并不是Navicat

SQL逐渐成为职场必备的编程语言&#xff0c;相信大家都不陌生。SQL是一种结构化查询语言&#xff0c;是用于数据库之间通信的编程语言。每个数据库都有着自己独特的访问规则&#xff0c;但大体上是遵循SQL标准。 因此&#xff0c;辗转于不同的数据库之间&#xff0c;开发者或D…...

UnityShader常用函数(UnityShader内置函数、CG和GLSL内置函数等)

空间变换函数函数名描述float4 UnityWorldToClipPos(float3 pos )把世界坐标空间中某一点pos变换到齐次裁剪空间float4 UnityViewToClipPos(float3 pos )把观察坐标空间中某一点pos变换到齐次裁剪空间float3 UnityObjectToViewPos(float3 pos或float4 pos)模型局部空间坐标系中…...

Springboot自定义注解-1

注解用于修饰其他的注解(纪委&#xff1a;管干部的干部) ① Retention&#xff1a;定义注解的保留策略 Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中&#xff0c;在class字节码文件中不包含 Retention(RetentionPolicy.CLASS) …...

经纬度标定及大地坐标系相关概念(一)

经纬度标定及大地坐标系相关概念&#xff08;一&#xff09;一、背景二、经纬度的概念三、大地坐标系四、大地坐标系的分类五、各类坐标系介绍5.1 我国地理坐标系5.1.1 北京54坐标系5.1.2 1980西安坐标系5.1.3 2000国家大地坐标系5.2 世界大地坐标系5.1.1 WGS84坐标系5.3 加密坐…...

synchronized关键字原理

synchronized原理 1、基本特点 基于锁策略&#xff0c;可以知道synchronized具有以下特性&#xff1a; 1.开始时候是乐观锁&#xff0c;如果锁冲突频繁就转换为悲观锁 2.开始是轻量级锁&#xff0c;如果锁持有的时间较长&#xff0c;就转换成重量级锁 3.实现轻量级锁的时候…...

面试被问死怎么办?学会这四招,通过的机率提升30%

软件工程师面试很难&#xff0c;难到什么程度呢&#xff1f;有一句话可以来形容&#xff1a; 面试造飞机&#xff0c;上班拧螺丝 没错&#xff0c;面试的时候各种问你原理、机制&#xff0c;而这些在实际工作中却很难用到。于是乎&#xff0c;很多工程师面试的时候就非常害怕…...

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件&#xff0c;在leanback的依赖库中&#xff0c;这里介绍一些常用的组件&#xff0c;使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…...

Xshell 下载及安装

文章目录下载安装连接服务器Xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界…...

【LeetCode】剑指 Offer(12)

目录 题目&#xff1a;剑指 Offer 30. 包含min函数的栈 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 30. 包含m…...

vue在history模式下打包部署问题解决

引言 项目使用的模板是element-template&#xff0c;由于业务需要&#xff0c;我将路由的hash模式更改为了history模式&#xff0c;然后在打包部署项目时就出现了问题 个人发现是资源的访问路径有问题&#xff0c;在部署之后发现每次访问的js资源路径前都会自动携带上我路由的…...

Java中常见性能优化策略的总结

文章目录1. 代码优化2. 数据库层面优化SQL调优架构层面的调优连接池调优3. 网络优化4. 缓存缓存分类使用场景选型考虑什么时候更新缓存&#xff1f;如何保障更新的可靠性和实时性&#xff1f;缓存是否会满&#xff0c;缓存满了怎么办&#xff1f;缓存是否允许丢失&#xff1f;丢…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...