排序算法实现(基于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,剩下的几个排序后面做到题在更吧。希望大家看完能练一下熟练掌握这几个简单排序算法的实现,哪里写的不好的也请大家指出,谢谢!

相关推荐
流年如夢1 天前
算法效率:复杂度原理解析
c语言·数据结构·算法
cpp_25011 天前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
田梓燊1 天前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
re林檎1 天前
算法札记——4.27
算法
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
数据牧羊人的成长笔记1 天前
逻辑回归与Softmax回归
算法·回归·逻辑回归
郑州光合科技余经理1 天前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
Mrlxl.cn1 天前
计算机网络——网络层
c语言·数据结构·计算机网络·考研
d111111111d2 天前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
寒秋花开曾相惜2 天前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.1 逻辑门&4.2.2 组合电路和HCL布尔表达式)
linux·网络·数据结构·笔记·学习·fpga开发