输入n个数,按升序排列
选择排序 :每次选择最小的排在前面——大概率的
θ
(
n
2
)
θ(n^2)
θ(n2)
#include<cstdio>
#include<algorithm>
using namespace std;
int main() {
int a[500005];
int n;
scanf("%d",&n);
for(int i=0; i < n; i++){
scanf("%d",&a[i]);
}
for(int i=0; i<n; ++i){
for( int j=i+1; j<n; ++j){
if(a[i]>a[j]){
}
}
}
for(int i=0; i < n; i++){
printf("%d%c",a[i]," \n"[i==n-1]);
}
return 0;
}
标题冒泡排序:每次讲最大的冒泡放在最后
for(int i=1;i<n;++i)
for(int j=0;j<n-i;++j)
if(a[j]>a[j+1])
swap(a[j+1],a[j]);
标题插入排序——小概率的
O
(
n
2
)
O(n^2)
O(n2)
for(int i=0; i<n; ++i)
for(int j=i; j>0;--j)
if(a[j]<a[j-1])
swap(a[j],a[j-1]);
else
break;
归并排序——
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
数组作为参数传入
#include<cstdio>
#include<iostream>
void sort(int L, int R, int a[],int b[]){
if(L==R)
return;
int mid=(L+R) >> 1;
sort(L,mid,a,b);
sort(mid+1,R, a, b);
int L_idx=L;
int R_idx=mid+1;
int b_idx=L;
while (L_idx <= mid && R_idx<= R)
if(a[L_idx]<a[R_idx])
b[b_idx++]=a[L_idx++];
else
b[b_idx++]=a[R_idx++];
while(L_idx<=mid)
b[b_idx++]=a[L_idx++];
while(R_idx<=R)
b[b_idx++]=a[R_idx++];
for(int i=L;i<=R;++i)
a[i]=b[i];
}
int main() {
int a[500000];
int b[500000];
int n;
scanf("%d",&n);
for(int i=0; i < n; i++)
scanf("%d",&a[i]);
sort(0,n-1,a,b);
for(int i=0; i < n; i++)
printf("%d%c",a[i]," \n"[i==n-1]);
system("pause");
return 0;
}
数组作为全局变量
#include<cstdio>
#include<iostream>
int a[50000];
int b[50000];
void sort(int L, int R){
if(L==R)
return;
int mid=(L+R) >> 1;
sort(L,mid);
sort(mid+1,R);
int L_idx=L;
int R_idx=mid+1;
int b_idx=L;
while (L_idx <= mid && R_idx<= R)
if(a[L_idx]<a[R_idx])
b[b_idx++]=a[L_idx++];
else
b[b_idx++]=a[R_idx++];
while(L_idx<=mid)
b[b_idx++]=a[L_idx++];
while(R_idx<=R)
b[b_idx++]=a[R_idx++];
for(int i=L;i<=R;++i)
a[i]=b[i];
}
int main() {
int n;
scanf("%d",&n);
for(int i=0; i < n; i++)
scanf("%d",&a[i]);
sort(0,n-1);
for(int i=0; i < n; i++)
printf("%d%c",a[i]," \n"[i==n-1]);
system("pause");
return 0;
}
快速排序——
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)见讲义1324-1328
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 500005
int n,a[maxn];
int partition(int l,int r){
int pivot=a[l];
while(l<r){
while(l<r&&a[r]>=pivot) r--; a[l]=a[r];
while(l<r&&a[l]<=pivot) l++; a[r]=a[l];
}
a[l]=pivot;
return l;
}
void solve(int l,int r){
if(r-l+1<=1) return;
int mid=partition(l,r);
solve(l,mid);
solve(mid+1,r);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",a+i);
}
solve(0,n-1);
for(int i=0;i<n;++i){
printf("%d",a[i]);
if(i!=n-1) printf(" ");
else printf("\n");
}
system("pause");
return 0;
}
以下错误版本原因爆栈,具体未知???
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
using namespace std;
int a[50];
void sort(int L, int R){
if(L>=R)
return;
int bound=a[rand()%abs(R-L)];
int L_idx=L;
int R_idx=R;
while(L_idx <= R_idx){
while(a[L_idx]<bound)
++L_idx;
while(bound<a[R_idx])
--R_idx;
if(L_idx<=R_idx)
swap(a[L_idx++],a[R_idx--]);
}
sort(L,R_idx);
sort(L_idx,R);
}
int main() {
int n;
scanf("%d",&n);
for(int i=0; i < n; i++)
scanf("%d",&a[i]);
sort(0,n-1);
for(int i=0; i < n; i++)
printf("%d%c",a[i]," \n"[i==n-1]);
system("pause");
return 0;
}