首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一.排序问题 及 二分法查找。

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

作者头像
用户11719974
发布2025-11-15 08:48:18
发布2025-11-15 08:48:18
60
举报

一.raptor的使用

raptor的一个页面

63d0ddb1152d46f5a3916c97f9f7898d.png
63d0ddb1152d46f5a3916c97f9f7898d.png

1.赋值

99d724f9b3004c0fb6b9d31692e23847.png
99d724f9b3004c0fb6b9d31692e23847.png

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

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

2.输入

1116c25cb9d24644baa87974cabbd0fc.png
1116c25cb9d24644baa87974cabbd0fc.png

        输入提示(第一个框):需要用英文引号括起来,输入提示顾名思义就是在程序运行起来后提示用户需要输入数据了,如这里输入的"please input"。

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

那么程序运行到此处后会跳出:

df23bfabb54249afa69297e46c611c53.png
df23bfabb54249afa69297e46c611c53.png

3.循环

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

6b2f54bbc3434e0bb16a272f00e63327.png
6b2f54bbc3434e0bb16a272f00e63327.png

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

50ba54cf25f5420585cd08aae1b7b985.png
50ba54cf25f5420585cd08aae1b7b985.png

4.输出

425cb3247a804fb5b2241a25b3eb1fc6.png
425cb3247a804fb5b2241a25b3eb1fc6.png
4d6d86ed792e43449016729b0d4e46d9.png
4d6d86ed792e43449016729b0d4e46d9.png

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

5.选择

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

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

4abc8106589d48b6b535a801a1bcdcda.png
4abc8106589d48b6b535a801a1bcdcda.png

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

6.调用

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

二.排序问题

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

实现:

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

fd235d9762b940ef947e8b8c94b8b006.png
fd235d9762b940ef947e8b8c94b8b006.png

输出子图:

3e597a482a39417aa41d738383026470.png
3e597a482a39417aa41d738383026470.png

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

1.冒泡排序

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

动画图:

11e65dff8eb5430a81aebdf924c3f3b4.gif
11e65dff8eb5430a81aebdf924c3f3b4.gif

raptor图:

a48fc4efce154426a07f388ac2cd0859.png
a48fc4efce154426a07f388ac2cd0859.png

c代码:

代码语言:javascript
复制
#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
6da681668929468698afea04a97ba0b0.gif

raptor图:

575709b1500d4cb0a6374279d3df3bee.png
575709b1500d4cb0a6374279d3df3bee.png

c代码:

代码语言:javascript
复制
#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
41b3678bb64e44a2985d1128c7980ce8.gif

raptor图:

b2956948e3d74aa58de85e841c12463c.png
b2956948e3d74aa58de85e841c12463c.png

c代码:

代码语言:javascript
复制
#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
7aca8391979c4144b87adf8165a8fe6d.png

2.子图

0783944dcb6e40ffb5fa7a62acc4db85.png
0783944dcb6e40ffb5fa7a62acc4db85.png

c代码:

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.raptor的使用
    • 1.赋值
    • 2.输入
    • 3.循环
    • 4.输出
    • 5.选择
    • 6.调用
  • 二.排序问题
    • 1.冒泡排序
    • 2.简单选择排序
    • 3.插入排序
  • 三.二分法查找
    • 1.主图
    • 2.子图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档