一.排序问题 及 二分法查找。

一.raptor的使用

raptor的一个页面

63d0ddb1152d46f5a3916c97f9f7898d.png

1.赋值

99d724f9b3004c0fb6b9d31692e23847.png

变量,可以用理解数学中的自变量的方式去理解,它是可以随时改变的,赋值就是将一个数字赋给变量,变量必须是字母。

其中第一个框应该输入变量如这里的i,第二个框应输入数字,如这里的1。

2.输入

1116c25cb9d24644baa87974cabbd0fc.png

这里输入语句的作用是在程序运行以后把用户在键盘上输入的数据储存起来,并且把它赋值给一个变量(这个变量是第二个框中输入的变量)

其中第一个框是输入提示需要用英文引号括起来,输入提示顾名思义就是在程序运行起来后提示用户需要输入数据了,如这里输入的"please input"在程序运行到此处后会跳出:

df23bfabb54249afa69297e46c611c53.png

第二个是输入变量的框,你需要填入一个变量,用于储存程序运行到此处后你所输入的数据,如这里的。

3.循环

循环语句只需要填一个框,为循环退出的条件如:

6b2f54bbc3434e0bb16a272f00e63327.png

注意:循环语句使用一般需要加入循环调整,要不然会近入死循环如:

50ba54cf25f5420585cd08aae1b7b985.png

4.输出

425cb3247a804fb5b2241a25b3eb1fc6.png

4d6d86ed792e43449016729b0d4e46d9.png

输出框内填入的数据用双引号括起来,运行时系统会把里面的内容直接输出,即上图会输出i。而不加双引号(只有变量才可以该操作)系统会把它转换为对应的数据输出,那么上图二会输出1。

5.选择

选择语句向框内填入条件,满足条件向yes方向执行,不满足则向no方向执行。

用一上五个语句我们可以完成一个输出1到50以内的偶数

4abc8106589d48b6b535a801a1bcdcda.png

在程序语言中“=”表示赋值,“==”表示等于,然后这里“i%2”表示i除以2的余数。

6.调用

如果把所有内容写在一个图里是很繁杂的,我们需要多个图来写,就有了主图和子图,而调用就是把子图与主图之间联系起来。调用的框内只需要填入子图的名称。

二.排序问题

简介:排序顾名思义就是把混乱数据变得有序,接下来讲的排序是按大小关系来排(不是所有排序都是按大小顺序的标准)。要把一个数据从小到大排列,那就避免不了判断大小,这个不像我们做数学题一样扫一眼就能写出来,要知道在程序中一次只能比较两个数的大小,也许我们会3个数的排序的程序,那么4个,10个,20个甚至更多呢,那么要把一个数据有序的排列起来就需要一定的技巧。

实现:

1.首先我们需要一个主图用来产生随机数,其中a[i]是一个数组相当于数学中的数列,它用来存储产生的随机数,i 就是它的下标。floor(random*100+1)的作用是产生1到100的随机数。然后我们来给a数组中的这些随机数排序。

fd235d9762b940ef947e8b8c94b8b006.png

输出子图

3e597a482a39417aa41d738383026470.png

下面三种排序的主图和输出子图都是一样的,只是中间的排序子图不同,运用了三种方法。

1.冒泡排序

(1)从数组a的第一个元素开始,依次往后读取a中的各个元素。                                                      (2)对每两个相邻的元素进行比较,如果当前元素大于下一个元素,则执行交换操作。
(3)经过这一步,最大的元素会被放置在数组的最后位置。
(4)然后重新从数组的头部开始新一轮的比较,这次只比较剩余的元素,在剩余元素中找到最大的元素放在倒数第二的位置。
(5)当所有的元素都经过至少一次的比较后,冒泡排序过程完成。此时,数组中的元素是按照从小到大的顺序排列的。

动画图:

11e65dff8eb5430a81aebdf924c3f3b4.gif

raptor图:

a48fc4efce154426a07f388ac2cd0859.png

c代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int a[10],t;
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		a[i] = rand() % 100 + 1;
		printf("%d ", a[i]);
	}
	printf("\n");
	for (int i = 0; i < 9; i++)
	{
		for(int j=0;j<9-i;j++)
			if (a[j] > a[j + 1])
			{
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

2.简单选择排序

      从 所有个元素中找出最小的元素与第一个元素交换,那么现在第一个是有序,我们从第二个开始找,找到最小的一个与第二个元素交换,现在前两个就是有序的了,以此类推循环下去直到进行到最后一个这串元素就排好了。

动画图:

6da681668929468698afea04a97ba0b0.gif

raptor图:

575709b1500d4cb0a6374279d3df3bee.png

c代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
	int a[10],t;
	srand ((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		a[i] = rand() % 100 + 1;
		printf("%d ", a[i]);
	}
	printf("\n");
	for (int i = 0; i < 9; i++)
	{
		for (int j = i + 1; j < 10; j++)
		{
			if (a[i] > a[j])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
	for (int i=0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

3.插入排序

        首先认为第一个数是有序的,然后从第二个数开始与前一个比较,并排好序,然后接着第三个与前面排后序的从后往前逐个比较,找到适当的位置(大于前一个,小于后一个)并插入,以此类推,直到最后一个,就可以排好了

动画图:

41b3678bb64e44a2985d1128c7980ce8.gif

raptor图:

b2956948e3d74aa58de85e841c12463c.png

c代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
	int a[10], t;
	srand((unsigned int)time(NULL));
	for (int i = 0; i < 10; i++)
	{
		a[i] = rand() % 100 + 1;
		printf("%d ", a[i]);
	}
	printf("\n");
	for (int i = 1; i < 10; i++)
	{
		if (a[i] < a[i - 1])
		{
			int t = a[i];
			int j = i - 1;
			for (j=i-1;j>=0&&t<a[j];j--)
			{
				a[j + 1] = a[j];
			}
			a[j + 1] = t;
		}
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

三.二分法查找

简介:

      在做一些数据处理的时候可能需要查找是否存在某个数,而当这些数是有序排列的时候用二分查找是很高效的,而且也比较简单。二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素。。

实现:

       这种方法是通过将目标元素和查找范围的中间值做比较(如果目标元素=中间值,查找结束),通过做比较将目标元素分到较大/或者较小的一组。从而将查找范围缩小一半。重复多次,直到目标元素=新的范围的中间值,查找结束。

1.主图

7aca8391979c4144b87adf8165a8fe6d.png

2.子图

0783944dcb6e40ffb5fa7a62acc4db85.png

c代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int k, a[10] = { 2,3,5,6,9,13,18,20,29,30 };
	scanf("%d", &k);
	int left = 0, right = 9;
	int m = (left + right) / 2;
	while (a[m] != k && left < right)
	{
		if (a[m] < k)
		{
			left = m + 1;
		}
		else
		{
			right = m - 1;
		}
		m = (left + right) / 2;
	}
	if(a[m]==k)
	{
		printf("%d",m);
	}
	else
	{
		printf("NO");
	}
	return 0;
}
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值