这篇文章我们不讲题,而是专门讲一个专题
排序!!!
这讲排序呢,我们主要讲一下冒泡排序,插入排序与最为简洁的快排
1、冒泡排序
大家喝碳酸饮料的时候,会发现杯底的泡泡一个个升起来(然后爆掉),由此,人们想到了冒泡排序(官方说法???)
所以,冒泡排序的大概思想就是一遍遍的过滤,讲更小的数(或更大的)一个个让它“冒”到前面去
#include<iostream>
#include<cmath>
using namespace std;
int a[100001];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n;i>1;i--){
for(int j=1;j<i;j++){
if(a[j]>a[j+1])
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
return 0;
}
这是一个升序的冒泡排序,降序的改一下符号就可以了
2、插入排序
既然上一个排序有那么奇葩的起源,那这个排序有没有呢(滑稽),其实,确实是有的,据说这个排序是从扑克牌中获得的灵感
打扑克牌的时候一般都会将牌有序的拿好,这就很像一个插入排序的过程
插入排序,就是每输入一个数,就在原有的数中找到它的位置,输入完了,也就排完了,不过复杂度仍不容乐观,与冒泡排序一样,都是O(n^2)
#include<iostream>
using namespace std;
int a[100001],n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
int t=a[i];
for(int j=1;j<i;j++){
if(a[i]<=a[j]){
for(int k=i-1;k>=j;k--)
a[k+1]=a[k];
a[j]=t;
break;
}
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
return 0;
}
3、快排
快排我这里只会讲STL模板的用法,具体的代码不会在这里讲解,只会把代码粘上来
快排默认升序,所以想要降序要写函数
//升序快排
#include<iostream>
#include<algorithm>//sort的函数库
using namespace std;
int n,a[100001];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);//表示a[1]到a[n]升序
return 0;
}
//降序附加
/*
inline int cmp(int x,int y){
return x>y;
}
*/
//sort(a+1,a+n+1,cmp);
附录:
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int randomInRange(int start, int end){
return rand()%(end - start + 1) + start;
}
int Partition(int data[],int length,int start,int end){
if(data==NULL||length<=0||start<0||end>length)
throw new std::exception();
int index=randomInRange(start,end);
// int index=end;
swap(data[index],data[end]);
int small=start-1;
for(index=start;index<=end;index++){
if(data[index]<data[end]){
small++;
if(small!=index)
swap(data[index],data[small]);
}
}
small++;
swap(data[small],data[end]);
return small;
}
void QuickSort(int data[],int length,int start,int end){
if(start==end)
return ;
int index=Partition(data,length,start,end);
if(index>start)
QuickSort(data,length,start,index-1);
if(index<end)
QuickSort(data,length,index+1,end);
}
int main(){
int length;
scanf("%d",&length);
if(length<=0){
return 0;
}else{
int a[length];
for(int i=0;i<=length-1;i++)
scanf("%d",&a[i]);
QuickSort(a,length,0,length-1);
for(int i=0;i<=length-1;i++)
printf("%d ",a[i]);
return 0;
}
}