面试准备之手写9种排序算法(默认从小到大排序)之插入排序、冒泡排序、选择排序、希尔排序

news/2024/11/16 21:03:29/

插入排序

第一重循环下标从1到n-1,一是表示插入轮数,而是为下一重循环nums[j]和nums[j - 1]比较并交换(nums[j]>nums[j-1]时)做准备,再有就是下一重循环是逆向进行,由于之前的下标在之前的循环中已经经排序是有序的了,只要有nums[j] >= nums[j - 1]的就直接退出循环即可。这里可能有点难懂,但要注意插入排序其实是逐个插入的操作,理解到这点就能明白二重循环退出条件的深意了。代码如下:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {vector<int> nums;srand(time(0));for (int i = 0; i < 10; i++) nums.push_back(rand());for (int i =0; i <nums.size(); i++)cout << nums[i] << ' ';cout << endl;for (int i = 1; i < nums.size(); i++) {for (int j = i; j > 0 && nums[j] < nums[j - 1]; j--) {int temp = nums[j];nums[j] = nums[j - 1];nums[j - 1] = temp;}}for (int i = 0; i < nums.size(); i++)cout << nums[i] << ' ';
}

冒泡排序

最基本的算法>排序算法了。第一重循环表示次数上的循环,要总共冒泡nums.size() - 1次。第二重循环表示需要让nums[j]和nums[j+1]比较也是从0到nums.size() - 1的下标遍历。循环里面就比较并交换即可。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {vector<int> nums;srand(time(0));for (int i = 0; i < 10; i++) nums.push_back(rand());for (int i =0; i <nums.size(); i++)cout << nums[i] << ' ';cout << endl;for (int i = 0; i < nums.size() - 1; i++) {for (int j = 0; j < nums.size() - 1; j++) {if (nums[j] < num[j + 1]) {int temp = nums[j];nums[j] = nums[j - 1];nums[j - 1] = temp;	}}}for (int i = 0; i < nums.size(); i++)cout << nums[i] << ' ';
}

选择排序

每次选择一个第i小的数,放到数组第i个位置上。实现时先用一个一重循环(下标从0到n-1,表示要选择n-1次,剩下一个必然是最大就不用选了),表示比较次数,依次往后。第二层也是一个逆循环,j从n-1到i+1取值,用一个minindex将i的值赋给它,依次将该下标值和nums[j]比较,比nums[j]小的话就将他俩交换一下,这样从后往前也能保证最后nums[minindex]是minindex下标(其实也就是i,只不过为了形象化定义了一个变量罢了)往后的数中最小的那一个,这样我们排序的目的也就达到了。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {vector<int> nums;srand(time(0));for (int i = 0; i < 10; i++) nums.push_back(rand());for (int i =0; i <nums.size(); i++)cout << nums[i] << ' ';cout << endl;for (int i = 0; i < nums.size() - 1; i++) {int minindex = i;for (int j = nums.size() - 1; j > i; j--) {if (nums[j] < nums[minindex]) {int temp = nums[j];nums[j] = nums[minindex];nums[minindex] = temp;}}}for (int i = 0; i < nums.size(); i++)cout << nums[i] << ' ';
}

Shell排序 

相当于插入排序的升级版,不过用到了二分的思想,每次分成n/i份,每份有i个元素,各份起始下标视为0,对应下标处互相交换即可,只不过间隔由原本的1变成了i。二重循环内就是被分成的每一份内的起始下标的遍历了。再在内层循环中调用一个insesort2函数,这个函数就是原先的插入函数间隔更换后的改写版。代码如下:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;void insesort2(vector<int>& nums, int n, int incr) {for (int i = incr; i < n; i+=incr) {for (int j = i; j >= 0 && nums[j] < nums[j - incr]; j-= incr) {int temp = nums[j];nums[j] = nums[j - incr];nums[j - incr] = temp;cout << "swap" << nums[j - incr] << ' ' << nums[j] << endl;}}
}int main() {vector<int> nums;srand(time(0));for (int i = 0; i < 10; i++) nums.push_back(rand());for (int i =0; i <nums.size(); i++)cout << nums[i] << ' ';cout << endl;for (int i = nums.size() / 2; i > 2; i/=2) {for (int j = 0; j < i; j++) {insesort2(nums, nums.size(), i);}}insesort2(nums, nums.size(), 1);for (int i = 0; i < nums.size(); i++)cout << nums[i] << ' ';
}

需要注意的是insesort2中第二层循环要用到插入排序相关知识,需要理解清楚,尤其j初始值和判断条件中比0大这一条件应该弄清楚。


http://www.ppmy.cn/news/1446717.html

相关文章

搭建基础镜像(centos+jdk)

搭建基础镜像&#xff08;centosjdk&#xff09; 1. 目录结构1.1 应用目录2.2 镜像目录 2. 编写Dockerfile2.1 设置工作目录2.2 解决时间同步问题&#xff08;设置时区&#xff09;2.3 核心逻辑2.4 设置环境变量 3. 构建镜像3.1 构建镜像3.2 导出镜像 1. 目录结构 1.1 应用目录…

2024年Q1季度电子书线上市场数据分析:高端市场潜力巨大,销额同比超170%!

数字阅读设备的普及和互联网技术的不断进步&#xff0c;越来越多的读者选择使用电子书来获取知识和娱乐。在今年Q1季度中&#xff0c;电子书线上市场规模正在持续扩大。 根据鲸参谋数据显示&#xff0c;在线上电商平台&#xff08;某东&#xff09;电子书Q1销量累计约23.3万件…

uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

【NR RedCap】Release 18标准中对5G RedCap的增强

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

获取Java 虚拟机进程ID(java应用进程Id的方法) Linux windows

可以通过以下几种方式获取Java虚拟机&#xff08;JVM&#xff09;的进程ID&#xff08;PID&#xff09;&#xff1a; 在Linux/Unix/macOS系统中&#xff1a; 使用ps命令结合grep: ps -ef | grep java这个命令会列出所有包含"java"的进程信息。从中你可以找到你的Jav…

vscode使用EditorConfig进行项目配置

安装 EditorConfig for VS Code 插件&#xff0c;该插件会自动读取项目的 .editorconfig 文件&#xff0c;对项目进行配置。 该文件支持属性&#xff1a; indent_style&#xff1a;缩进风格&#xff0c;可配置项&#xff1a;tab&#xff0c;spaceindent_size&#xff1a;缩进…

“大唐杯”基础知识(部分)

DL&#xff1a;下载 UL&#xff1a;上行链路 在5G系统中&#xff1a;2.1GHZ DL最大4流&#xff0c;UL最大2流&#xff1b;700MHZ DL最大2流&#xff0c;UL最大1流 在5G系统中&#xff1a;在手机开机流程中&#xff0c;负责业务承载建立的过程是PDU会话建立过程 NR中支持基础的4…

设计模式(十一):外观模式

设计模式&#xff08;十一&#xff09;&#xff1a;外观模式 1. 外观模式的介绍2. 外观模式的类图3. 外观模式的实现3.1 创建一个接口3.2 创建接口的实现3.3 创建一个外观类3.4 测试 1. 外观模式的介绍 外观模式&#xff08;Facade Pattern&#xff09;属于结构型模式&#xf…