为了迎接算法设计课半期考,把几个比较简单的算法写了一写
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
/*冒泡排序,最简单的排序
在一个序列中,如果左边的数大于右边,那就交换他们
当然你也可以反向冒泡,这都取决于你的需求*/
void bubbleSort(vector<int> &q){ //冒泡排序,时间复杂度O(N^2)
for(int i=q.size()-1;i>0;i--)
{
bool flag=false;
for(int j=0;j+1<=i;j++){
if(q[j]>q[j+1]){
swap(q[j],q[j+1]);
flag=true;
}
}
if(!flag)
break;
}
}
/*首先找出数组中最小的元素,让它和数组第一个元素交换位置。
第二步,在剩下的元素中继续寻找最小的元素,和数组第二个元素交换位置*/
void selectSort(vector<int> &q){ //选择排序,O(N^2)
int min,len=q.size();
for(int i=0;i<q.size();i++)
{
min=i;
for(int j=i+1;j<q.size();++j)
{
if(q[j]<q[min])
min=j;
}
if(i!=min)
swap(q[i],q[min]);
}
}
/*插入排序:数组左边是有序区,右边无序区。
把无序区的第一个元素和有序区进行比较,放在有序区的合适位置。*/
void insertSort(vector<int> &q){ //插入排序,O(N^2)
for(int i=1;i<q.size();i++)
{
int tmp=q[i]; //无序区的一个元素
for(int j=i-1;j>=0;--j){ //无序区第一个元素前的都是有序区
if(q[j]>tmp)
{
q[j+1]=q[j];
q[j]=tmp;
}
else break;
}
}
}
/*传说中的希尔排序(缩小增量排序)
每一轮按照事先决定二点间隔进行插入排序,间隔会逐渐缩小,最后变成了1*/
void shellSort(vector<int> &q){ //希尔排序
int gap=q.size()/2;
while(gap){
for(int i=gap;i<q.size();i+=gap){ //按gap(间隔)增长
int t=q[i],j;
for(j=i-gap;j>=0;j-=gap){
if(q[j]>t)
q[j+gap]=q[j];
else
break;
}
q[j+gap]=t;
}
gap/=2;
}
}
/*归并,也就是合并排序,分治法*/
void mergeSort(vector<int> &q,int l,int r){ //归并排序O(nlogn)
if(l>=r)
return;
int mid=l+r>>1;
mergeSort(q,l,mid);
mergeSort(q,mid+1,r);
static vector<int> w;
w.clear();
int i=l,j=mid+1;
while(i<=mid&&j<=r){
if(q[i]>q[j])
w.push_back(q[j++]);
else
w.push_back(q[i++]);
}
while (i<=mid)
w.push_back(q[i++]);
while(j<=mid)
w.push_back(q[j++]);
for(int i:w)
q[l++]=i;
}
void quickSort(vector<int> &q,int l,int r){ //快排,yyds,O(nlogn)
if(l>=r)
return;
int i=l-1,j=r+1,x=q[l+rand()%(r-l+1)];//哨兵
while(i<j)
{
do j--;
while(q[j]>x);//找小于x的
do i++;
while(q[i]<x);//找大于x的
if(i<j)
swap(q[i],q[j]);
else{
quickSort(q,l,j);
quickSort(q,j+1,r);
}
}
}
int main()
{
int n,t;
vector<int> q;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>t;
q.push_back(t);
}
/*bubbleSort(q);
selectSort(q);
insertSort(q);
shellSort(q);
mergeSort(q,l,r);
quickSort(q,l,r);*/
for(int i=0;i<q.size();i++)
{
cout<<q[i]<<'\n';
}
return 0;
}