开始复习基本算法了,今天下午看了三个排序算法,都是入门级别的。
一、冒泡排序
1、思想:有两层循环,当前的位置如果到了i(第一层循环),那么就从i+1到n中开始遍历(第二层循环),为的是在i到n中找到最小的,放置在当前的位置上,与选择排序的不同是,选择排序是在第二层循环之后,将保存的最小位置与i交换,而冒泡排序中数组[i]的值一直在变,所以才叫冒泡
2、时间复杂度:最坏时间复杂度为O(n^2)
3、实现代码:
#include <iostream> using namespace std; int main(){ int n = 0; int a[101]; while(scanf("%d",&n)!=EOF){ for(int i =0;i<n;i++){ cin>>a[i]; } for(int i = 0;i<n;i++){ for(int j = i+1;j<n;j++){ if(a[j]<a[i]){ int c = a[i]; a[i]=a[j]; a[j]=c; } } } for(int i =0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl; } return 0; }
二、选择排序
1、原理:与冒泡排血的不同点为:在第一层循环里设置一个最小值量,并在第二层中选择到最小值所在下座标赋予,最后交换位置
2、时间复杂度:O(N^2)
3、源代码:
#include <iostream>
using namespace std;
int a[101];
int main(){
int n = 0;
cin>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
}
for(int i =0;i<n;i++){
int flag = i;
for(int j = i+1;j<n;j++){
if(a[j]<a[flag]){
flag = j;
}
}
int c = a[i];
a[i] = a[flag];
a[flag] = c;
}
for(int i = 0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
三、插入排序
1、原理:循环到数组某个元素i时,向前面遍历(第二层循环),前面已经排好序了,因此一个一个向前换,直到到达排好序的位置后插入。
2、时间复杂度:O(N^2)
3、源代码:
#include <iostream>
using namespace std;
int a[101];
int main(){
int n = 0;
cin>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
}
for(int i =1;i<n;i++){
for(int j = i;j>0;j--){
if(a[j]<a[j-1]){
int c = a[j-1];
a[j-1]=a[j];
a[j]=c;
}
}
}
for(int i = 0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}