排序,去重,算法

桶排序,冒泡排序,快速排序

1. 桶排序是最快的,时间复杂度是O(N+M)

M表示桶的个数,N表示待排序的数的个数
先对桶清零

for(i=0;i<1000;i++)
  	a[i]=0;

当需要排序的对象的范围比较小时,占优势

2. 冒泡排序是O(N²)

基本思想:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换
双重嵌套循环

for(i=0;i<n-1;i++)
	for(j=0;j<n-1;j++)
		if(a[j]>a[j+1])
		{	t=a[i];a[i]=a[j];a[j]=t  }

每一趟只能把一个数的位置确定,所以N个数需要排序,需要N-1次归为,最后一个自然归为

3.快速排序是O(NlogN)

思想:“二分”的思想
每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边

最差的时间复杂度是O(N²)
平均时间复杂度为O(NlogN)

quicksort(int left,int right)
{
	int i, j, t, temp;
	if(left>right)
		return;
	temp=a[left];
	i=left;
	j=right;
	while(i!=j)
	{
		while(a[j]>=temp&&i<j)
			j--;
		while(a[i]<=temp&&i<j)
			i++;
		if(i<j)
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
			}
		a[left]=a[i];
		a[i]=temp;
	quicksort(left,i-1);
	quicksort(i+1,right);
	return;
}

4.去重

第一种方法先去重,再排序

桶排序稍加改动 注意桶排序的不能太多,也就是元素的范围不能太大(1~1000刚好)

for(i=0;i<n;i++)
{
	scanf("%d",&t);
	a[t]=1;
}
for(i=0;i<=1000;i++)
	if(a[i]==1)
		printf("%d",i);

时间复杂度就是桶排序的时间复杂度O(M+N)

.

第一种方法先排序再去重

排序可以用冒泡排序或者快速排序
使用冒泡排序N不能太大(100),时间复杂度O(N²),N越大执行的时间就越长;
如果N<=10万,
通常认为计算机每秒钟大约运行10亿次(当然实际情况要更快)
用冒泡排序需要10秒
用快速排序还不到0.0017秒。

printf("%d",a[1]);   //输出第一个数
for(i=2;i<=n;i++)
	if(a[i]!=a[i-1];
		printf("%d",a[i]);
		return 0;

时间复杂度有两部分组成(排序+输入输出)
冒泡排序O(N²)
输入输出都是O(N)
整个算法的时间复杂度为O(2*N+N²) 即O(N²)

5总结

1.桶排序最快,它的时间复杂度是O(N+M)
·····缺点:当数的范围超过1000,无法申请出这么大的数组来标记数,浪费空间
2.冒泡排序是(N²)
·····缺点:浪费时间

3.快速排序是O(NlogN)费手费键盘

猜你喜欢

转载自blog.csdn.net/qq_45896330/article/details/108214066
今日推荐