题:输入n个整数,进行去重、从小到大排序,输出。运行时间限制为1秒。
解:第一种方法:先将n个图书的ISBN号去重,再进行从小到大排序并输出,例如桶排序。
一.桶排序
思想:用数组记录出现的图书号,存在则为1,输出数组中值为1的数组下标。
实现:
#include<stdio.h>
int a[101],n; //定义全局变量,这两个变量需要在子函数中用到
void QuickSort(int low, int high)
{
int i,j,pviot;
if(low>high)
return;
pviot=a[low];i=low;j=high;
while(i!=j)
{
while(i<j&&a[j]>=pviot)j--;
a[i]=a[j];
while(i<j&&a[i]<=pviot)i++;
a[j]=a[i];
}
a[i]=pviot;
QuickSort(low,i-1);
QuickSort(j+1,high);
}
int main()
{
int n,i,pviot;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
QuickSort(1,n);
for(i=1;i<=n;i++)
{
printf("%d",a[i]);
}
}
时间复杂度:O(M+N)
1.采用冒泡排序,在输出的时候判断这个数a[i]与前面一个a[i-1]是否相同,不相同则输出。
实现:
#include<stdio.h>
int main()
{
int a[1000],i,j,n,t,x,y=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
a[i]=t;
}
for(i=1;i<n;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}
printf("%d ",a[1]);
for(i=2;i<=n;i++)
if(a[i]!=a[i-1])
{
y++;
printf("%d ",a[i]);
}
printf("\n%d ",y+1);
}
时间复杂度:O(n²)
2.采用快速排序
//先排序后去重,快速排序
#include<stdio.h>
int a[1000];
void Quicksort(int low,int high)
{
int i=low,j=high,pviot=a[low];
if(i>j)
{
return;
}
while(i!=j)
{
while(i<j&&a[j]>=pviot) j--;
a[i]=a[j];
while(i<j&&a[i]<=pviot) i++;
a[j]=a[i];
}
a[i]=pviot;
Quicksort(low,i-1);
Quicksort(i+1,high);
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
Quicksort(1,n);
printf("%d ",a[1]);
for(i=2;i<=n;i++)
if(a[i]!=a[i-1])
printf("%d ",a[i]);
}
时间复杂度:O(NlogN)
总结:桶排序最快。