算法
桶排序,冒泡排序,快速排序
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)费手费键盘