常见初级排序
1.冒泡排序
for(int i=n;i>=2;i--){
for(int j=1;j<=i;j++){
if(a[i-1]>a[i]){
swap(a[i-1],a[i]);
}
}
}
思路:从左到右扫一遍,遇到左侧比右侧大的就交换。
时间复杂度: O(n^2) 。
空间复杂度: O(n) 。
2.选择排序
for(int i=2;i<=n;i++){
int v=i;
for(int j=i+1;j<=n;j++){
if(a[j]<a[v]){
v=j;
}
}
swap(a[i],a[v]);
}
思路:从左到右扫,找到右边最小的数,与他交换。
时间复杂度: O(n^2) 。
空间复杂度: O(n) 。
3.桶排序
for(int i=1;i<=n;i++){
cin>>m;
a[m]++;
}
for(int i=1;i<=1000;i++){
while(a[i]--){
cout<<i<<" ";
}
}
思路:在输入时用map
或int []
存储每个数出现的次数,再输出。
时间复杂度: O(n+m) 。
空间复杂度: O(m) 。
4.STL标准模板库排序(sort)
sort(a+1,a+n+1);
时间复杂度: O(nlogn) 。
空间复杂度: O(n) 。
较为复杂(其实也没多复杂)的排序
5.快速排序
void qs(int a[],int l,int r){
if(l<r){
int i=l,j=r,k=a[l];
while(i<j){
while(i<j&&k<=a[j])j--;
a[i]=a[j];
while(i<j&&k>=a[i])i++;
a[j]=a[i];
}
a[i]=k;
qs(a,l,i-1);
qs(a,i+1,r);
}
}
思路: 选择第一个元素作为基准值。比基准值高的放在基准值右边,比基准值低的放在基准值左边。在对两边用相同的方法排序。
时间复杂度: 平均 O(nlogn) ,最坏 O(n^2) 。
空间复杂度: O(n) ,辅助空间 O(logn) 。