目的
昨天我们学习了数组,今天当然是使用数组来写一些东西啦!当然今天还学习了用几种排序方式来进行一些数的从大到小的排序。那么今天我们要怎么用这两个知识点来写一个什么样的程序呢?尽情期待!!!
几种排序的方式
1.冒泡排序法
冒泡排序法是我之前还算记得牢靠的一种排列数字的方法,顾名思义,它的意思就是让一个较大的元素通过“冒泡”的方式让其渐渐的“浮”到数组的最后。
算法原理:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后数组的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
代码实现:
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++){//比较的次数
for (int j = 0; j < 10-i-1; j++){
if (num[j] > num[j+1]) {
//交换j和j+1的值
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
2.选择排序法
选择排序就是要一组数中选出最大(最小)的数然后将其放在第一位;然后找出剩下的数中找出第二大(小)的数放在第二位;以此类推。最后就可以得到一组数的排序。
算法原理:
1.对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置。
2.对每一对相邻元素作同样的工作。从开始第一对到结尾的最后一对。在这一点,最后我们会得到最小的数的位置。
3.然后进行判断,如果这个元素不是第一个元素,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。
4.然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
代码实现:
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10-1; i++){
//默认这是最小的
//int min = num[i];//3
for (int j = i+1; j < 10; j++){
//控制用min和后面的每一个进行比较
if (num[i] > num[j]){
//j对应的数字比min还小 交换
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
//一次遍历之后找到最小的值min
//num[i] = min;
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
3.插入排序法
其目的就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
算法实现 :
1.选择序列的第一个元素作为有序序列;
2.将后面的一个元素插入到前面的有序数列中,以此类推。最后得到排序好的数列。
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++) {
//让i和i+1比较大小
if (num[i] > num[i+1]) {
//交换值
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
//让num[i]和前面的所有进行比较
for (int j = i; j > 0; j--){
if (num[j] < num[j-1]) {
temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
实际使用
那么现在就来到了写代码的环节了,今天我们写了两个很有意思的代码
1.“杀人”游戏
这个游戏就是将一群人围成一圈编号比如7个人,绕着圈依次喊1,2,3,当有人喊到3时这个人退出游戏,下一个重新喊1,2,3,直到只剩下一个人
具体代码实现
#include<stdio.h>
#include<iostream>
#define KILL -1
int main()
{
int total;
int killNumber;
int a[100];
int count=0;
printf("请输入玩游戏的人数:");
scanf_s("%d", &total);
printf("请输入死亡编号:");
scanf_s("%d", &killNumber);
for (int i = 0; i < total; i++)
{
a[i] = i + 1;
}
int number = 0;
for (int i = 0; i < total; i++)
{
if (a[i] != KILL)
{
number++;
if (number == killNumber)
{
a[i] =KILL;
count++;
if (count == total - 1)
{
break;
}
number = 0;
}
}
if (i == total - 1)
{
i = -1;
}
}
for (int i = 0; i < total; i++)
{
if (a[i] != KILL)
printf("%d",a[i]);
}
system("pause");
return 0;
}
2.第二个游戏
猜数字游戏;系统自动生成按大小排序不重复的4个数;自己输入4个数,然后进行比较,如果位置对数字对输出一个A如果数字对位置不对输出B,根据系统提示输入下一组数,直到全对,结束游戏。
#include<stdio.h>
#include<iostream>
#include"stdlib.h"
#include"time.h"// 含有随机数函数的头文件
void initArray(int array[]);
int main()
{
int array[4];
int myArray[4];
int countA = 0;
int countB = 0;
initArray(array);
for (int i = 0; i < 4; i++)
{
printf("%d ", array[i]);
}
while (1)
{
printf("输入数字:");
for (int i = 0; i < 4; i++)
{
scanf_s("%d", &myArray[i]);
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (myArray[j] == array[i])
{
if (i == j)
{
countA++;
}
else
{
countB++;
}
}
}
}
if (countA == 4)
{
printf("恭喜!!!!");
break;
}
else {
printf("%dA%dB", countA, countB);
countA = 0;
countB = 0;
}
}
system("pause");
return 0;
}
void initArray(int array[]) {
srand((unsigned int)time(NULL)*10);//重置种子
for (int i = 0; i < 4; i++) {
int temp = 0;
bool isExist = false;
while (1) {
//产生一个随机数
temp = rand() % 10;
//1 2 3
//判断这个数字在数组里面是否存在
//i表示当前数组里面已经存进去几个了
for (int j = 0; j < i; j++) {
if (array[j] == temp) {
//存在了
isExist = true;
break;
}
}
//什么情况下出来
//1.break 2.遍历完毕还没找到相同
if (isExist == false) {
break;
}
}
//将这个随机数添加到数组里面
array[i] = temp;
//进行大小排序
for (int k = i; k > 0; k--)
{
if (array[k] <= array[k - 1])
{
int t;
t = array[k];
array[k] = array[k - 1];
array[k - 1] = t;
}
}
}
}
写在后面
可以看到在这两个程序里面用了较多的排序,我们在排序时一定要注意循环是要遍历整个数组;明白什么时候结束程序;在写排序程序时可以先再别的地方搞清楚如何循环,再下手编写。