文章目录
简单易实现的三大排序

这里为了方便大家写好后检验我们可以直接以洛谷这个题来检查代码。并且这里给的只有三个数据我们使用这三个排序也不会太麻烦。
插入排序
对于插入排序我个人的理解是将数组分成两部分:已排序和未排序。我们每轮的任务就是从未排序序列中选择一个数并为其在已排序序列中找到一个合适的位置供其插入。什么时候算是找到插入位置呢?如果是升序排序就是当我们第一次在已排序序列中找到一个数小于等于(等于是为了排序的稳定性)当前选择的数的时候我们就可以把这个数插到他后面去。那如果已排序序列中的数大于当前这个数呢?我们就需要像打牌一样把已排序序列中的数往后移便于空出位置插入。因此循环内的逻辑就是:大于>>元素后移;小于等于>>找到位置插入。 那我们应该怎么控制循环呢?初始状态下我们可以从第二个元素开始,这样前面只有一个元素当然可以认为是排好序的。接下来我们只需要记录下当前未排序序列中选定的这个数(因为后续可能会因为元素移动而被覆盖)往前开始找插入位置即可。于是代码如下:
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,剩下的几个排序后面做到题在更吧。希望大家看完能练一下熟练掌握这几个简单排序算法的实现,哪里写的不好的也请大家指出,谢谢!