“桶排序”
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[11]={0};
for(int i = 1; i <= 5; i++)
{
int x;
scanf("%d", &x);
a[x]++;
}
printf("从小到大排序:\n");
for(int i = 0; i < 11; i++)
{
for(int j = 1; j <= a[i]; j++)
printf("%d ", i);
}
printf("\n");
printf("从大到小排序:\n");
for(int i = 10; i >= 0; i--)
{
for(int j = 1; j <= a[i]; j++)
printf("%d ", i);
}
printf("\n");
return 0;
}
这种排序方法有一个很大的缺点就是占空间,一旦ID特别大的时候,需要开辟无用的空间很大。
冒泡排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[100];
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
printf("从大到小排序:\n");
for(int i=1; i<= n-1; i++)
{
printf("从%d到第%d\n", 1, n-i+1);
for(int j = 1; j <= n-i; j++)
{
if(a[j] < a[j+1])
{
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
printf("第%d冒泡排序:\n", i);
for(int m = 1; m <= n; m++)
printf("%d ",a[m]);
printf("\n");
}
for(int i = 1; i <= n; i++)
printf("%d ",a[i]);
return 0;
}
用冒泡对分数进行排名
现在分别有 5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分和 gaoshou 8分。请按照分数从高到低,输出他们的名字。即应该输出 gaoshou、huhu、xixi、haha、hengheng
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[21];
char score;
};
int main()
{
struct student a[100],x;
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%s %d", &a[i].name, &a[i].score);
for(int i=1; i<= n-1; i++)
{
for(int j = 1; j <= n-i; j++)
{
if(a[j].score < a[j+1].score)
{
x = a[j];
a[j] = a[j+1];
a[j+1] = x;
}
}
}
printf("按分数排名的结果:\n");
for(int i = 1; i <= n; i++)
//for(int i = n; i >= 1; i--)
printf("%s %d\n",a[i].name, a[i].score);
return 0;
}
快速排序
#include <bits/stdc++.h>
using namespace std;
int a[101],n;
void quicksort(int left, int right)
{
int i, j, t, temp;
if(left > right)
return;
temp = a[left];
i= left;
j = right;
printf("left is %d, right is %d\n",left, right);
while(i!=j)
{
while(a[j] >= temp && i < j)
j--;
printf("j is %d, a[j] is %d\n",j, a[j]);
while(a[i] <= temp && i < j)
i++;
printf("i is %d, a[i] is %d\n",i, a[i]);
if(i<j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
for(int i = 1 ; i <= n; i++)
printf("%d ", a[i]);
printf("\n");
quicksort(left, i-1);
quicksort(i+1, right);
}
int main()
{
scanf("%d", &n);
for(int i = 1 ; i <= n; i++)
scanf("%d", &a[i]);
quicksort(1,n);
for(int i = 1 ; i <= n; i++)
printf("%d ", a[i]);
return 0;
}
小哼买书
小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读 哪些书。小哼让每个同学写出一个自己想读的书的 ISBN号。当然有一些好书会有很多同学都喜欢, 这样就会收集到很多重复的 ISBN号。小哼需要去掉其中重复的 ISBN号,即每个 ISBN号只 保留一个,也就说同样的书只买一本然后再把这些 ISBN 号从小到 大排序,小哼将按照排序好的 ISBN号去书店买书。请你协助小哼完成“去重”与“排序” 的工作。
输入有 2 行,第 1 行为一个正整数,表示有 n 个同学参与调查(n≤100)。第 2 行有 n 个用空格隔开的正整数,为每本图书的 ISBN号(假设图书的 ISBN号在 1~1000之间)。 输出也是 2行,第 1行为一个正整数 k,表示需要买多少本书。第 2行为 k个用空格隔 开的正整数,为从小到大已排好序的需要购买的图书的 ISBN号。
输入:
10
20 40 32 67 40 20 89 300 400 15
输出:
8
15 20 32 40 67 89 300 400
方法一:利用桶排序解决问题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[1001]={0};
int n;
int cnt = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
a[x]=1;
}
printf("从小到大排序:\n");
for(int i = 1; i <= 1000; i++)
{
for(int j = 1; j <= a[i]; j++)
printf("%d ", i);
}
printf("\n");
return 0;
}
方法二:利用冒泡排序
#include <bits/stdc++.h>
using namespace std;
void bubbling(int *nums, int length)
{
// printf("从大到小排序:\n");
for(int i=1; i<= length-1; i++)
{
// printf("从%d到第%d\n", 1, n-i+1);
for(int j = 1; j <= length-i; j++)
{
if(nums[j] > nums[j+1])
{
int t = nums[j];
nums[j] = nums[j+1];
nums[j+1] = t;
}
}
// printf("第%d冒泡排序:\n", i);
// for(int m = 1; m <= n; m++)
// printf("%d ",a[m]);
// printf("\n");
}
}
int main()
{
int n;
scanf("%d", &n);
int a[n+1];
memset(a,0,sizeof(a));
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
bubbling(a,n+1);
printf("%d ",a[1]);
for(int i = 2; i <= n; i++)
{
if(a[i] != a[i-1])
printf("%d ",a[i]);
}
return 0;
}
方法三:利用快排
#include <bits/stdc++.h>
using namespace std;
int a[101],n;
void 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);
}
int main()
{
scanf("%d", &n);
for(int i = 1 ; i <= n; i++)
scanf("%d", &a[i]);
quicksort(1,n);
printf("%d ",a[1]);
for(int i = 2; i <= n; i++)
{
if(a[i] != a[i-1])
printf("%d ",a[i]);
}
return 0;
}