一:冒泡排序
定义:依次比较相邻两个元素,如果左边的数大于右边的数,那么这两个数交换位置。
过程:
2 | 5 | 3 | 4 | 6 | 1 | 原数 |
2 | 5 | 3 | 4 | 6 | 1 | 第一次比较2和5 |
2 | 3 | 5 | 4 | 6 | 1 | 第二次比较5和3 |
2 | 3 | 4 | 5 | 6 | 1 | 第三次比较5和4 |
2 | 3 | 4 | 5 | 6 | 1 | 第四次比较5和6 |
2 | 3 | 4 | 5 | 1 | 6 | 第五次比较6和1 |
第一轮结束 | ||||||
准备从头开始第二轮 |
第一轮 :
第一次比较2和5,2<5,所以不交换位置
第一次比较5和3,5>3,所以交换位置
第一次比较5和4,5>4,所以交换位置
第一次比较5和6,5<6,所以不交换位置
第一次比较6和1,6>1,所以交换位置
2 | 3 | 4 | 5 | 1 | 6 | 第二轮开始的数 |
2 | 3 | 4 | 5 | 1 | 6 | 第一次比较2和3 |
2 | 3 | 4 | 5 | 1 | 6 | 第二次比较3和4 |
2 | 3 | 4 | 5 | 1 | 6 | 第三次比较4和5 |
2 | 3 | 4 | 1 | 5 | 6 | 第四次比较5和1 |
2 | 3 | 4 | 1 | 5 | 6 | 第五次比较5和6 |
第二轮:
第一次比较2和3,2<3,所以不交换位置
第一次比较3和4,3<4,所以不交换位置
第一次比较4和5,4<5,所以不交换位置
第一次比较5和1,5>1,所以交换位置
第一次比较5和6,5<6,所以不交换位置
依次按这个顺序(我太懒了,实在不想写了)比较下去得到的最终数字就是1 2 3 4 5 6
图像解说(来源于百度)
那么代码应该怎么敲呢
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[100];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n-i;j++)
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}
可以看一下输出结果
二 选择排序:
定义:第一次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
我懒得写过程了,直接上百度的图。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
if(a[i]>a[j])
swap(a[i],a[j]);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
三.桶排序
#include<bits/stdc++.h>//桶排序
using namespace std;//利用数组下标和数字相同,然后输出数组下标即可。
int a[1000];//写在主函数外,为全局变量,自动默认里面的值全部都为0 。
int main(){
int n;
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
cin>>x;
a[x]++;//在数组所有元素初值为0的情况下,
//我把数字和数组下标一样的数里面的值全部成为1,即不为0
}
for(int i=0;i<1000;i++)
if(a[i]!=0)//为0的相当于没有这个数字,
//把数字排序此时就相当于把元素值为1的数组元素下标排序
cout<<i<<" ";
return 0;
}
//数字超过10000不建议用桶排序