排序算法实现(基于408)

文章目录

简单易实现的三大排序

这里为了方便大家写好后检验我们可以直接以洛谷这个题来检查代码。并且这里给的只有三个数据我们使用这三个排序也不会太麻烦。

插入排序

对于插入排序我个人的理解是将数组分成两部分:已排序和未排序。我们每轮的任务就是从未排序序列中选择一个数并为其在已排序序列中找到一个合适的位置供其插入。什么时候算是找到插入位置呢?如果是升序排序就是当我们第一次在已排序序列中找到一个数小于等于(等于是为了排序的稳定性)当前选择的数的时候我们就可以把这个数插到他后面去。那如果已排序序列中的数大于当前这个数呢?我们就需要像打牌一样把已排序序列中的数往后移便于空出位置插入。因此循环内的逻辑就是:大于>>元素后移;小于等于>>找到位置插入。 那我们应该怎么控制循环呢?初始状态下我们可以从第二个元素开始,这样前面只有一个元素当然可以认为是排好序的。接下来我们只需要记录下当前未排序序列中选定的这个数(因为后续可能会因为元素移动而被覆盖)往前开始找插入位置即可。于是代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
  int a[3];
  cin>>a[0]>>a[1]>>a[2];
  for(int i = 1;i<3;i++){
  	int cur = a[i];
  	int j;
  	for(j = i-1;j>=0;j--){
  		if(a[j]>cur){
  			a[j+1] = a[j];
		  }else{
		  	break;
		  }
	  }
	  a[j+1] = cur;
  } 
  
  cout<<a[0]<<" "<<a[1]<<" "<<a[2];
  }

选择排序

选择排序的思想我觉得就更简单了:每轮从数组中选一个最小的元素把它交换到第一位即可。因此在循环内我们只需要比较即可,最后用cpp自带的swap函数把他和当前轮中的第一位元素交换即可。代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
  int a[3];
  cin>>a[0]>>a[1]>>a[2];
  
  for(int i = 0;i<3;i++){
  	int min_index = i;
  	for(int j = i+1;j<3;j++){
  		if(a[j] < a[min_index]){
  			min_index = j;
		  }
	  }
	  swap(a[i],a[min_index]);
  }
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]; 
  }

冒泡排序

个人感觉冒泡排序和插入排序其实很像,如果是升序排序的话我们每轮会将一个最大的元素冒到后面去,因此数组末尾已排好序的序列会逐渐变长。并且由于冒泡排序每轮都会交换因此当数组没有发生交换时就可以判断当前已排好序可以停止,因此我们可以设置一个bool变量,每当调用过swap函数就将其值改为true,每轮开始前又改回false,这样当出现一轮没有变化时就可以提前退出循环。在循环外我们可以设置一个end变量用来记录当前已排好序的位置,初始状态下end = 最后一个元素所在位置(只有一个元素可以认为是有序的)于是代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main(){
  int a[3];
  cin>>a[0]>>a[1]>>a[2];
  
  int end = 2;
  bool flag = true;
  while(flag){
  	flag = false;
  	for(int i=0;i<end;i++){
  		if(a[i]>a[i+1]){
  			swap(a[i],a[i+1]);
  			flag = true;
		  }
	  }
	  end--;
  } 
  cout<<a[0]<<" "<<a[1]<<" "<<a[2]; 
  }

最近再看408的os,剩下的几个排序后面做到题在更吧。希望大家看完能练一下熟练掌握这几个简单排序算法的实现,哪里写的不好的也请大家指出,谢谢!

相关推荐
Liudef0631 分钟前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
OYpBNTQXi2 小时前
SEAL全同态加密CKKS方案入门详解
算法·机器学习·同态加密
yuannl102 小时前
数据结构----队列的实现
数据结构
蚂蚁数据AntData2 小时前
破解AI“机器味“困境:HeartBench评测实践详解
大数据·人工智能·算法·机器学习·语言模型·开源
ZC跨境爬虫2 小时前
Python异步IO详解:原理、应用场景与实战指南(高并发爬虫首选)
爬虫·python·算法·自动化
Mr_Xuhhh3 小时前
从ArrayList到LinkedList:理解链表,掌握Java集合的另一种选择
java·数据结构·链表
倦王3 小时前
力扣日刷47-补
python·算法·leetcode
沉鱼.443 小时前
第十三届题目
c语言·c++·算法
ZHOU_WUYI3 小时前
ppo算法简单实现
人工智能·pytorch·算法
无限进步_4 小时前
【C++】巧用静态变量与构造函数:一种非常规的求和实现
开发语言·c++·git·算法·leetcode·github·visual studio