明明的随机数冒泡排序c 语言,C++ 试题 算法提高 明明的随机数

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

输入有2行,第1行为1个正整数,表示所生成的随机数的个数:N

第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入

10

20 40 32 67 40 20 89 300 400 15

样例输出

8

15 20 32 40 67 89 300 400

数据规模和约定

(N≤100)

法一:

解题方法:

利用set容器本身的性质,去重和排序

用户自行输入,然后直接输出即可。

源程序:

#include

#include//头文件

using namespace std;

setm;

void getdate(int n)//输入

{ int x; for (int i = 0; i < n; i++) { cin >> x; m.insert(x); }

}

int main()

{ int n; cin >> n; getdate(n); set::iterator p = m.begin(); cout << m.size() << endl;//去重完后的数据个数 for (p; p != m.end(); p++)//输出 cout << *p << " "; cout << endl;

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

评测结果:

b60fd58e85e0255cf8a5045077cd433c.png

法二:

解题方法:

首先是排重:利用数组来检验是否已经输入过相同的数字

还有一种方法是:用户每输入一个数据,就和该数组之前的数据对比,这样每输入一个都要遍历数组,效率较低。当数据量较小时也是不错的一种方法。

其次是排序:可以使用sort()函数,直接进行排序,或者就是用户自行编写排序函数进行排序。

常见的排序方法有:插入排序,冒泡排序,选择排序,谢尔排序,快速排序,堆积排序,二路归并排序,基数排序。

本题目我使用的是谢尔排序,可根据自己喜好选择对口的排序方法。

源程序:

#include

#include

#include

using namespace std;

int a[100];

int length = 0;//去重完毕后的长度

void distinct(int n)//去重函数

{

int dis[1000] = { 0 };

int b[100];

//memset(dis, 0, sizeof(dis));//初始化为零

for (int i = 0; i < n; i++)

{

cin >> b[i];//中间数组

if (dis[b[i]] == 0)//说明之前没有输入过b[i]对应的数据,这种方法会比遍历数组比较相同的效率更高

{ a[length++] = b[i]; dis[b[i]] = 1;//!!!

}

}

}

void sorting()//排序函数

{

//sort(a, a + length);

int gap = length;//谢尔排序,任选其一。

int flag;

while (gap > 1)

{

gap = gap / 2;

do

{ flag = 0; for (int i = 0; i < length - gap; i++) { int j = i + gap; if (a[i] > a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; flag = 1; } }

} while (flag != 0);

}

}

void print()//输出

{

cout << length << endl;

for (int i = 0; i < length; i++)

cout << a[i] << " ";

cout << endl;

}

int main()

{

int n;

cin >> n;

distinct(n);

sorting();

print();

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

评测结果:

fe149ffb370c00f24974e2d0e2fa0df0.png

文章来源: blog.csdn.net,作者:先生卖我几斤仁义道德,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_49243150/article/details/113739057

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值