常用排序算法总结。【力求持续更新】

1、归并排序:

归并排序是将两个或者两个以上的有序序列进行合并的一种排序算法。采用了分治的思想。一般使用递归。

最好、最坏、平均时间复杂度都是O(nlgn)。

由于在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归深度为lg2n的栈空间,因此

空间复杂度为O(n+logn)

#include<iostream>
#include<cstring>//写个归并排序酸爽一下
using namespace std;
template<typename T>
void Merge(T* a,int first,int mid,int last)
{
	T* tmp=new T[last-first+1];
	int i=first;
	int j=mid+1;
	int ti=0;
	while(i<=mid && j<=last)
	{
		if(a[i]<a[j])
		tmp[ti++]=a[i++];//一轮赋值后指向待排序的那个值   first---mid , mid+1  ---- last
		else
		tmp[ti++]=a[j++];
	}
	if(i<=mid)
	{
		memcpy(tmp+ti,a+i,sizeof(T)*(mid-i+1));
	}
	else
	{
		memcpy(tmp+ti,a+j,sizeof(T)*(last-j+1));
	}
	
	memcpy(a+first,tmp,sizeof(T)*(last-first+1));
	delete[] tmp;
	
}

template<typename T>
void Merge_sort(T* a,int low,int high)
{
	if(low<high)
	{
		int mid=low+((high-low)>>2);
		Merge_sort(a,low,mid);			//第一分段包括mid 
		Merge_sort(a,mid+1,high);		//第二分段不包括mid,从mid+1开始 
		Merge(a,low,mid,high);
	}
	
	return;
	
}


int main()
{
	int n;
	while(cin>>n)
	{
		int* a=new int[n];
		for(int i=0;i<n;++i)
			cin>>a[i];
		Merge_sort(a,0,n-1);
		for(int i=0;i<n;++i)
		{
			cout<<a[i];
			if(i==n-1)cout<<endl;
			else cout<<",";
		}
		delete[] a;
			
		
	}
	
	
	
	return 0;
} 

2、插入排序:

这里介绍的超好:

http://blog.csdn.net/morewindows/article/details/6665714


3、希尔排序:

插入排序的升级版,将待排序数组分成若干组字数组分别进行插入排序,最后将基本有序的整个数组进行一轮插入排序,效率上比插入排序要好。

这里介绍的很详细:

http://blog.csdn.net/morewindows/article/details/6668714

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值