Cpp class exercise 4:修订间差异
跳转到导航
跳转到搜索
无编辑摘要 |
|||
| (未显示同一用户的5个中间版本) | |||
| 第4行: | 第4行: | ||
自行输入【例4-1】、【例4-2】,编辑至运行通过。 | 自行输入【例4-1】、【例4-2】,编辑至运行通过。 | ||
【例4-1】数组的定义、赋值和遍历 | === 【例4-1】数组的定义、赋值和遍历 === | ||
<syntaxhighlight lang="C++" line> | <syntaxhighlight lang="C++" line> | ||
#include <iostream> | #include <iostream> | ||
| 第37行: | 第37行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
【例4-2】数组排序 | === 【例4-2】数组排序 === | ||
<syntaxhighlight lang="C++" line> | <syntaxhighlight lang="C++" line> | ||
#include <iostream> | #include <iostream> | ||
| 第89行: | 第89行: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
http://static.hanyu123.cn/wiki/images/algorithm_compare_sort_w600.gif | |||
== 知识点 == | == 知识点 == | ||
| 第103行: | 第105行: | ||
2、使用循环语句,逐个访问数组的元素。 | 2、使用循环语句,逐个访问数组的元素。 | ||
=== | === 冒泡排序算法 === | ||
【例4-3】冒泡排序 | 【例4-3】冒泡排序 | ||
| 第193行: | 第195行: | ||
到此,经过不断比较和交换,最小的数不断上升,大的数逐个下沉,完成了从小到大的排序。 | 到此,经过不断比较和交换,最小的数不断上升,大的数逐个下沉,完成了从小到大的排序。 | ||
整个过程像气泡上升一样,所以也称为“冒泡排序”。 | 整个过程像气泡上升一样,所以也称为“冒泡排序”。 | ||
冒泡排序动画演示: | |||
http://static.hanyu123.cn/wiki/images/algorithm_bubble_sort_w600.gif | |||
http://www.bilibili.com/video/av18176281/ | |||
== 扩展 == | == 扩展 == | ||
2019年5月25日 (六) 21:34的最新版本
预习练习
自行输入【例4-1】、【例4-2】,编辑至运行通过。
【例4-1】数组的定义、赋值和遍历
#include <iostream>
using namespace std;
int main()
{
int a[3]; //定义数组
a[0]= 1; //通过索引引用,并赋值。注意索引是从0开始的。
a[1]= 2;
a[2]= 3;
int b[3]= {5,6,7}; //定义数组并同时赋值。注意括号是花括号。
for(int i=0;i<3;i++)
{
cout << a[i] << endl;
}
//计算数组b的长度,为什么要用这种方法呢?
//如果改成 int lenth = sizeof(b);
// lenth的值会是多少呢?
int lenth = sizeof(b)/sizeof(int);
for(int i=0;i<lenth;i++)
{
cout << b[i] << endl;
}
return 0;
}
【例4-2】数组排序
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define random(x) (rand()%x)
using namespace std;
int main()
{
int a[10];
srand((int)time(0));//用系统时间来做种子
for(int i=0;i<10;i++)
{
a[i] = random(100); // 取100以内的随机数
}
//原始顺序
for(int i=0;i<10;i++)
{
cout << a[i] << ","; // 逐个输出
}
cout << endl;
for(int i=0;i<10;i++)
{
for(int j=i+1;j<10;j++)
{
if(a[i]>a[j])
{
//交换
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
//排序以后的顺序
for(int i=0;i<10;i++)
{
cout << a[i] << ","; // 逐个输出
}
cout << endl;
return 0;
}
知识点
数组的赋值方式
方法一:逐个赋值。注意索引值从0开始。
方法二:批量赋值。
数组的遍历
1、获得数组的长度
2、使用循环语句,逐个访问数组的元素。
冒泡排序算法
【例4-3】冒泡排序
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define random(x) (rand()%x)
using namespace std;
int main()
{
int a[10];
srand((int)time(0));//用系统时间来做种子
for(int i=0;i<10;i++)
{
a[i] = random(100); // 取100以内的随机数
}
//原始顺序
for(int i=0;i<10;i++)
{
cout << a[i] << ","; // 逐个输出
}
cout << endl;
int n = sizeof(a)/sizeof(int);
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
//交换
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//排序以后的顺序
for(int i=0;i<10;i++)
{
cout << a[i] << ","; // 逐个输出
}
cout << endl;
return 0;
}
假设共有10个数
第一轮:
1、从第1个数开始,将第1个数和第2个数比较,如果第1个数比第2个数大,交换两者。
2、将第2个数和第3个数比较,如果第2个数比第3个数大,交换两者。
3、将第3个数和第4个数比较,如果……
……
9、将第9个数和第10个数比较,如果第9个数比第10个数大,交换两者。
经过这一轮的比较,最大的数就是第10个。
第二轮:
与第1轮相同(可以只比较到第9个数)经过比较,最大的数是第10个,第二大的数是第9个。
第三轮:
与之前的相同(可以只比较到第8个数),经过比较,最大的数是第10个,第二大的数是第9个,第二大的数是第8个。
第十轮: 与之前的相同(可以只比较到第2个数)。
到此,经过不断比较和交换,最小的数不断上升,大的数逐个下沉,完成了从小到大的排序。 整个过程像气泡上升一样,所以也称为“冒泡排序”。
冒泡排序动画演示:
http://www.bilibili.com/video/av18176281/
扩展
【例4-1】的数组遍历,可以改用while 循环语句实现吗?
【例4-2】是按从小到大排序的,如果要改成从大到小排序,应该怎么修改?
【例4-2】和【例4-3】的排序有什么不同?
在各个例子的多个for 循环语句中,都使用了相同的int i,这些i之间是什么关系?互相会有影响吗?