/*
一:最快最简单的排序——桶排序(此处并不是真正的桶排序)
缺点:时间复杂度高
代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
int book[1001], i, j, n, x;
scanf("%d", &n);
memset(book, 0, sizeof(book)); //初始化为零
for(i = 0; i < n; i++)
{
scanf("%d", &x); //把每一个数读到变量x中
book[x]++; //进行计数
}
for(i = 1; i <= 1001; i++) //这里的数组不可以开的太大,要不然就会变成无限循环
{
for(j = 0; j < book[i]; j++) //出现了几次打印几次
{
printf("%d ", i);
}
}
getchar();
getchar();
/*这里的getchar();用来暂停程序,以便查看代码输出的内容
也可以用system(“pause”);等来代替*/
return 0;
}
*/
/*
二:冒泡排序
缺点:申请的空间大
基本思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来,核心是双重嵌套循环
#include<stdio.h>
int main(void)
{
int i, j, n, t, a[1001];
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - i - 1; j++)
{
if(a[j] < a[j + 1])
{
t = a[j], a[j] = a[j + 1], a[j + 1] = t;
}
}
}
for(i = 0; i < n; i++)
{
printf("%d%c", a[i], i == n - 1?'\n':' ');
}
return 0;
}
*/
/*
三:快速排序
优点:解决了浪费空间以及执行效率问题
代码:
#include<stdio.h>
void sqort(int a[], int left, int right)
{
int i = left, j = right, key;
key = a[left];
while(i >= j)
{
return ;
}
while(i < j)
{
while(i < j && a[j] >= key)
{
j--;
}
a[i] = a[j];
while(i < j && a[i] <= key)
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sqort(a, left, i - 1);
sqort(a, i + 1, right);
}
int main(void)
{
int a[1001], i, n;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sqort(a, 0, n - 1);
for(i = 0; i < n; i++)
{
printf("%d%c", a[i], i == n - 1?'\n':' ');
}
return 0;
}
*/
/*练习题:排序加去重*/
代码:
/*去重和排序*/
#include<stdio.h>
void sqort(int a[], int left, int right)
{
int i = left, j = right, key = a[left];
while(i >= j)
{
return ;
}
while(i < j)
{
while(i < j && a[j] >= key)
{
j--;
}
a[i] = a[j];
while(i < j && a[i] <= key)
{
i++;
}
a[j] = a[i];
}
a[i] = key;
sqort(a, left, i - 1);
sqort(a, i + 1, right);
}
int main(void)
{
int i, n, a[1001], ans = 1;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sqort(a, 0, n - 1);
printf("%d ", a[0]);
for(i = 1; i < n; i++)
{
if(a[i] != a[i - 1])
{
printf("%d ", a[i]);
ans++;
}
}
printf("\n");
printf("%d\n", ans);
return 0;
}