简单排序中有三种:①冒泡排序 ②选择排序 ③插入排序
注意区分一下这三种排序方法:
1.冒泡排序:
其思想是每次变换一轮,从末尾或者从头开始的位置逐渐变得有序。即大的沉下去或者小的浮上来。
小的浮上来代码如下:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
//冒泡排序:可以正着写,也可以反着写,就是一趟下来定了第一个循环的位置是有序的。
for(int i=0;i<n-1;i++){
bool flag = false;//如果在途中有任何一次都没发生交换,那么说明该序列已经有序了。
for(int j=n-1;j>i;j--){
if(num[j]>num[j-1]){
int temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
flag = true;
}
}
if(!flag){
break;
}
}
for(int i=0;i<n;i++){
if(i!=n-1) cout<<num[i]<<" ";
else cout<<num[i]<<endl;
}
return 0;
}
大的沉下去:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
for(int i=n-1;i>=0;i--){
bool flag = false;
for(int j=0;j<i;j++){
if(num[j]>num[j+1]){
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
flag = true;
}
}
if(!flag){
break;
}
}
for(int i=0;i<n;i++){
if(i!=n-1) cout<<num[i]<<" ";
else cout<<num[i]<<endl;
}
return 0;
}
2.选择排序
思想是:每次确定最小/大的元素,然后放在最前面或者最后面。(有点儿类似冒泡,但又有点不同,这里是记录的位置,只交换一次,而冒泡在一轮中交换很多次)
代码如下:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
//选择排序:在待排序的序列中找到最小的元素,将最小元素与未排序序列中首位元素交换位置;
for(int i=0;i<n;i++){
int minx = i;
for(int j=i+1;j<n;j++){
if(num[minx]>num[j]){
minx = j;
}
}
int temp = num[i];
num[i] = num[minx];
num[minx] = temp;
}
for(int i=0;i<n;i++){
if(i!=n-1) cout<<num[i]<<" ";
else cout<<num[i]<<endl;
}
return 0;
}
3.插入排序:
思想是:像打牌一样,慢慢地去摸牌,每次摸到一张牌然后进行找合适位置插入(即将原来已有序元素与新摸到的比较,如果比新的大,那么就将原来的牌向后移动一位,以此循环,直到找到不再比新的大的地方进行停止,然后插入。
代码如下:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int num[n];
for(int i=0;i<n;i++){
cin>>num[i];
}
//插入排序:从第一个元素开始认为是有序,然后加入下一个元素,然后将该元素跟之前已有序的进行比较找到合适的位置。
for(int i=1;i<n;i++){
int next = num[i];
int j;
for(j=i;j>0&&num[j-1]>next;j--){//如果num[j-1]不大于next,而前面是有序的因此,可以直接结束循环了。
num[j] = num[j-1];//进行移动
}
num[j]=next;//进行插入
}
for(int i=0;i<n;i++){
if(i!=n-1) cout<<num[i]<<" ";
else cout<<num[i]<<endl;
}
return 0;
}