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

embedded/2024/10/16 2:26:43/

插入排序

第一重循环下标从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/embedded/26037.html

相关文章

如何使用 ArcGIS Pro 查找小区最近的地铁站

学习 GIS 除了可以用在工作上之外&#xff0c;还可以将其运用到生活之中&#xff0c;比如查找距离小区最近的地铁站&#xff0c;这里为大家介绍一下查找的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

linux安装MySQL 8.0笔记

在Linux系统中安装MySQL 8.0的详细操作步骤如下&#xff1a; 1. 添加MySQL Yum Repository 首先&#xff0c;您需要添加MySQL的Yum仓库。这可以通过下载并安装一个RPM包来实现&#xff0c;该RPM包会将MySQL仓库添加到您的仓库列表中。 wget https://repo.mysql.com//mysql80-c…

长难句打卡4.30

Priestly explains how the deep blue color of the assistant’s sweater descended over they ears from fashion shows to departments stores and to the bargain bin in which the poor girl doubtless found her garment. 普里斯特利则向助手解释了她身上这件针织衫所采…

Electron+Vue3+Vite+ElectronForge整合 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发&#xff1b; Electron : 使用 JS 的语法开发。本文将从项目初始化开始&#xff0c;一步一步的完成项目的启动、打包全流程的介绍。实现的效果是 &#xff1a; 1、一个正常…

JavaScript ES6 全新的Set、Map数据结构

JavaScript ES6 全新的Set、Map数据结构 Map、Set都是ES6新的数据结构, 都是新的内置构造函数, 也就是说typeof的结果, 多了两个&#xff1a; Set 是不能重复的数组, 但不能[某一项来枚举出来] Map 是可以任何东西当做键的对象 set()数据结构 ES6 提供了新的数据结构 Set。…

git解决冲突问题

冲突问题&#xff1a;开发者的俩个分支都修改了同一个文件的同一部分时, Git 无法自动决定哪个版本是正确的, 因此会产生冲突。 解决冲突&#xff1a; 我们git在合并的过程中指出冲突文件&#xff0c;通过git status命令查看那个文件存在冲突 解决方法&#xff1a; 1&#xff0…

信息系统项目管理师0080:工程体系架构(5信息系统工程—5.4安全工程—5.4.4工程体系架构)

点击查看专栏目录 文章目录 5.4.4工程体系架构1.SSE-CMM基础2.ISSE过程3.ISSE-CMM体系结构5.4.4工程体系架构 信息系统安全工程(Information Security System Engineering, ISSE)是一门系统工程学,它的主要内容是确定系统和过程的安全风险,并且使安全风险降到最低或使其得到有…