排序算法比较和总结

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值