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

devtools/2024/11/15 19:58:51/

插入排序

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

相关文章

力扣刷题之准备工作

目录 一、力扣是什么&#xff1f; 1.1 概念 1.2 为什么要刷LeetCode题 1.3 LeetCode与其他OJ的异同点 二、LeetCode新手入门 2.1 LeetCode 注册 2.2 LeetCode 题库 2.2.1 题目标签 2.2.2 题目列表 2.2.3 当前进度 2.2.4 题目详情 2.3 LeetCode 刷题语言 2.4 Lee…

线上线下交友陪玩,支持小程序/app/h5三端打包,源码搭建!

社交APP定制开发的好处&#xff1a; 社交APP定制开发能够根据用户需求进行个性化定制&#xff0c;满足用户对于社交功能的特殊需求。不同用户对社交的理解和需求各不相同&#xff0c;定制开发可以根据用户的要求&#xff0c;提供更加个性化和专属的社交功能&#xff0c;为用户…

Shell脚本学习记录

0.理解Linux文件权限 0.1 Linux安全性 用户的权限是通过创建用户时分配的用户ID(UID)来追踪的&#xff0c;UID是个数值&#xff0c;每个用户都有一个唯一的UID 0.1.1 /etc/passwd文件 Linux系统使用一个专门的文件/etc/passwd来匹配登录名与对应的UID值&#xff0c;该文件包…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

国家开放大学2024年春《Matlab语言及其应用》实验一熟悉Matlab 操作环境参考答案

实验报告 姓名&#xff1a; 学号&#xff1a; 实验一名称&#xff1a;熟悉 Matlab 操作环境 实验目标&#xff1a;通过简单变量和矩阵的录入、计算和查看相关信息&#xff0c;了解 Matlab 操作界面 及各子窗口使用方法。熟悉一系列便于使用的 Matlab 函数和文件的工具。 实…

设计模式学习笔记 - 项目实战三:设计实现一个支持自定义规则的灰度发布组件(实现)

概述 上两篇文章&#xff0c;我们讲解了灰度组件的需求和设计的思路。不管之前讲的限流、幂等框架&#xff0c;还是现在讲的灰度组件&#xff0c;功能性需求都不复杂&#xff0c;相反&#xff0c;非功能性需求是开发的重点。 本章&#xff0c;按照上篇文章的灰度组件的设计思…

Q1营收稳健增长,云从科技如何在“百模大战”的险中求稳?

自从迈入大模型时代&#xff0c;AI行业可谓“一天一个样”。越来越多的企业涌现&#xff0c;舆论热议从未断绝。 但就像所有技术必须经历的那些考验&#xff0c;在现实尺度下&#xff0c;AI顺利走进商业化世界&#xff0c;仍然是少部分玩家掌握的稀缺能力。个中原因不尽相同&a…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…