1.冒泡排序
2.选择排序
3.插入排序
4.快速排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
void quick_sort(int *ss,int ll,int rr){
if(ll>=rr)return ;
int mm=(ll+rr)>>1;
int temp_ll=ll;
int temp_rr=rr;
int temp_num=ss[ll];
while(temp_rr>temp_ll){
while(temp_num<ss[temp_rr]&&temp_ll<temp_rr){
temp_rr--;
}
ss[temp_ll]=ss[temp_rr];
while(temp_ll<temp_rr&&temp_num>=ss[temp_ll]){
temp_ll++;
}
ss[temp_rr]=ss[temp_ll];
}
ss[temp_ll]=temp_num;
for(int ii=ll;ii<=rr;ii++){
cout<<ss[ii]<<" ";
}
cout<<endl;
quick_sort(ss,ll,temp_ll-1);
quick_sort(ss,temp_ll+1,rr);
return ;
}
int main()
{
int nn;
int s[10000];
while(scanf("%d",&nn)!=EOF){
for(int ii=0;ii<nn;ii++){
scanf("%d",&s[ii]);
}
quick_sort(s,0,nn-1);
for(int ii=0;ii<nn;ii++){
printf("%d",s[ii]);
}
printf("\n");
}
return 0;
}
5.归并排序
#include <iostream>
using namespace std;
void marg(int *ss,int ll,int mm,int rr){
int temp[10000];
int temp_l=ll;
int temp_r=mm+1;
int state=ll;
for(int ii=ll;ii<=rr;ii++){
temp[ii]=ss[ii];
}
while(temp_l<=mm&&temp_r<=rr){
if(temp[temp_l]<temp[temp_r]){
ss[state++]=temp[temp_l++];
}
else{
ss[state++]=temp[temp_r++];
}
}
while(temp_l<=mm){
ss[state++]=temp[temp_l++];
}
while(temp_r<=rr){
ss[state++]=temp[temp_r++];
}
return ;
}
void margin_sort(int *ss,int l,int r){
if(l>=r)return ;
int m=(l+r)>>1;
margin_sort(ss,l,m);
margin_sort(ss,m+1,r);
marg(ss,l,m,r);
return ;
}
int main()
{
int s[10000];
int nn,aa,bb;
while(cin>>nn){
for(int ii=0;ii<nn;ii++){
scanf("%d",&s[ii]);
}
margin_sort(s,0,nn-1);
for(int ii=0;ii<nn;ii++){
printf("%d",s[ii]);
}
}
return 0;
}
6.堆排序
#include <iostream>
using namespace std;
void swap_self(int &a,int &b){
a^=b;
b^=a;
a^=b;
}
void just(int *a,int state,int len){
int child;
child=(state<<1)+1;
if(child+1<len&&a[child+1]>a[child]){
child++;
}
if(a[child]>a[state])swap_self(a[state],a[child]);
//cout<<"state = "<<a[state]<<" "<<"child = "<<a[child]<<endl;
return ;
}
void build(int *a,int len){
for(int ii=len/2-1;ii>=0;ii--){
just(a,ii,len);
}
}
void judge(int *a,int len){
build(a,len);
for(int ii=len-1;ii>=1;ii--){
build(a,ii);
//cout<<a[0]<<" "<<a[ii]<<endl;
swap_self(a[ii],a[0]);
//cout<<a[0]<<" "<<a[ii]<<endl;
}
}
int main()
{
int s[11000];
int n;
cin>>n;
for(int ii=0;ii<n;ii++){
scanf("%d",&s[ii]);
}
judge(s,n);
for(int ii=0;ii<n;ii++){
printf("%d ",s[ii]);
}
printf("\n");
return 0;
}
7.希尔排序
希尔排序是在插入排序的基础上优化得到的,
在插入排序中,当数列本来就有序的时候,用插入排序的时间复杂度为O(n)。
而希尔排序则是在相同间隔的小数组中先排序,然后最后会在间隔为1的总数组中再次插入排序。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
void shellsort(int *a,int length){
int size=length;
while(size/2>0){
size=size>>1;
//length>>=1;
//cout<<"size = "<<size<<endl;
for(int ii=0;ii<size;ii++){
for(int jj=ii+size;jj<length;jj+=size){
int temp=a[jj];
int kk;
for(kk=jj;kk-size>=0;kk-=size){
if(a[jj]<a[kk-size]){
a[kk]=a[kk-size];
}
else break;
}
a[kk]=temp;
}
/*
for(int jj=ii;jj<length;jj+=size){
cout<<a[jj]<<" ";
}
*/
//cout<<endl;
}
}
return ;
}
int main()
{
int nn,s[10000];
cin>>nn;
for(int ii=0;ii<nn;ii++){
cin>>s[ii];
}
shellsort(s,nn);
//cout<<"ttttt"<<endl;
for(int ii=0;ii<nn;ii++){
cout<<s[ii]<<" ";
}
cout<<endl;
return 0;
}