一、桶排序(升序版)
//实现对一组数据的升序排序
#include<stdio.h>
int main()
{
int a[1001] = {0}, i, j, t, n;
scanf("%d", &n);
for(i = 1; i <= n; i ++)//依次输入n个数
{
scanf("%d", &t);
a[t] ++;//进行计数
}
for(i = 1000; i >= 0; i --)
{
for(j = 1; j <= a[i]; j ++)
{
printf("%d ", i);
}
}
return 0;
}
该算法时间复杂度为 O(M+N),但非常浪费空间
二、冒泡排序
#include<stdio.h>
int main()
{
int a[101], i, j, t, n;
scanf("%d", &n);//表示接下来有n个数
for(i = 0; i < n; i ++)
{
scanf("%d", &a[i]);
}
//冒泡排序的核心部分,双重for循环
for(i = 0; i < n-1; i ++)
{
for(j = i + 1; j < n; j ++)
{
if(a[j] > a[i])
{
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
for(i = 0; i < n; i ++)
{
printf("%d ", a[i]);
}
return 0;
}
空间利用率高了,但是时间复杂度为 O()
三、快速排序
#include<stdio.h>
int a[101], n;
void quicksort(int left, int right)
{
int i, j, t, temp;
if(left > right) return;
temp = a[left];//temp中存的基准数
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;
}
int main()
{
int i, j;
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]);
return 0;
}
最差的时间复杂度和冒泡排序一样O().
四、去重和排序
//方法一:使用桶排序,直接去重
#include<stdio.h>
int main()
{
int a[1001] = {0}, i, n, t;
scanf("%d", &n);
for(i = 1; i <= n; i ++)
{
scanf("%d", &t);//把每一个数读到变量t中
a[t] = 1;//标记出现过的数字
}
for(i = 1; i <= 1000; i ++)
{
if(a[i] == 1)
printf("%d ", i);
}
return 0;
}
该程序的时间复杂度就是桶排序的时间复杂度
//方法二:先用冒泡排序或快速排序进行排序,再去重
#include<stdio.h>
int main()
{
int a[101], n, i, j, t;
scanf("%d", &n);
for(i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
}
for(i = 1; i <= n-1; i ++)//先排序
{
for(j = 1; j<= n-i; j ++)
{
if(a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
printf("%d ", a[1]);//输出第一个数
for(i = 2; i <= n; i ++)
{
if(a[i] != a[i-1])
printf("%d ", a[i]);
}
return 0;
}