1 00:00:00,000 --> 00:00:08,532 >> [音乐播放] 2 00:00:08,532 --> 00:00:12,060 >> ZAMYLA陈:首先,你可能会 通知有关的发现是,我们已经 3 00:00:12,060 --> 00:00:13,450 已编写的代码我们。 4 00:00:13,450 --> 00:00:15,160 这就是所谓的分配的代码。 5 00:00:15,160 --> 00:00:18,000 所以,我们不只是编写我们自己的 从头开始编写代码了。 6 00:00:18,000 --> 00:00:22,800 相反,我们正在填补空隙 在某些预先存在的代码。 7 00:00:22,800 --> 00:00:27,790 >> 该find.c程序会提示输入数字 填补了草垛,搜索 8 00:00:27,790 --> 00:00:32,189 在haystack一个用户提交的针, 它是通过调用排序和 9 00:00:32,189 --> 00:00:35,590 定义的搜索,函数 在helpers.c。 10 00:00:35,590 --> 00:00:37,670 所以find.c已经写入。 11 00:00:37,670 --> 00:00:40,770 你的任务是写佣工。 12 00:00:40,770 --> 00:00:41,870 >> 所以我们在做什么? 13 00:00:41,870 --> 00:00:44,210 我们正在实施两种功能。 14 00:00:44,210 --> 00:00:49,030 搜索,返回true,如果一个值 在草垛被发现,返回 15 00:00:49,030 --> 00:00:51,370 假如果该值 不是在干草堆。 16 00:00:51,370 --> 00:00:57,990 然后我们也实施排序 这所谓的排序值数组。 17 00:00:57,990 --> 00:00:59,960 >> 因此,让我们来解决搜索。 18 00:00:59,960 --> 00:01:04,560 搜索当前实现为 线性搜索,但你可以做很多 19 00:01:04,560 --> 00:01:05,550 比这更好。 20 00:01:05,550 --> 00:01:09,910 线性搜索,现为O实现 n个时间,这是相当缓慢的。 21 00:01:09,910 --> 00:01:13,850 虽然,它可以搜索 给它的任何列表。 22 00:01:13,850 --> 00:01:20,130 你的任务是实现二分查找, 已运行日志的n时间为O。 23 00:01:20,130 --> 00:01:21,130 这是相当快的。 24 00:01:21,130 --> 00:01:23,170 >> 但是有一个规定。 25 00:01:23,170 --> 00:01:27,600 二进制搜索只能搜索 通过预排序的列表。 26 00:01:27,600 --> 00:01:30,370 这是为什么? 27 00:01:30,370 --> 00:01:32,620 >> 那么让我们来看一个例子。 28 00:01:32,620 --> 00:01:36,280 给定的值的数组,草垛, 我们要去寻找 29 00:01:36,280 --> 00:01:37,130 了针。 30 00:01:37,130 --> 00:01:40,460 并且在该示例中, 整数3。 31 00:01:40,460 --> 00:01:44,130 二进制搜索的工作方式是, 我们比较的中间值 32 00:01:44,130 --> 00:01:48,370 阵列到针,很像如何 我们开了一个电话簿中间 33 00:01:48,370 --> 00:01:50,660 在零一周页面。 34 00:01:50,660 --> 00:01:54,650 >> 所以中间值相比较之后 针,你可以放弃任 35 00:01:54,650 --> 00:01:58,530 左或阵列的右半 收紧你的界限。 36 00:01:58,530 --> 00:02:03,390 在这种情况下,由于3,我们的针, 小于10,中间值,该 37 00:02:03,390 --> 00:02:05,990 右边界会降低。 38 00:02:05,990 --> 00:02:08,400 但尽量让你的界限 尽可能紧。 39 00:02:08,400 --> 00:02:11,630 如果中间值不是针 那么你知道,你并不需要 40 00:02:11,630 --> 00:02:13,010 它包含在你的搜索。 41 00:02:13,010 --> 00:02:17,310 所以,你是对的绑定可以收紧 搜索范围更多的只是一点点, 42 00:02:17,310 --> 00:02:21,770 等等等等,直到 你发现你的针。 43 00:02:21,770 --> 00:02:23,480 >> 那么什么是伪代码是什么样子? 44 00:02:23,480 --> 00:02:28,420 好了,而我们仍然在寻找通过 列表中,仍然有元素 45 00:02:28,420 --> 00:02:33,690 看在,我们把列表的中间, 而且中间值比较 46 00:02:33,690 --> 00:02:34,950 我们的针。 47 00:02:34,950 --> 00:02:37,310 如果他们是平等的,那么这意味着我们已经 发现了针,我们可以 48 00:02:37,310 --> 00:02:38,990 返回true。 49 00:02:38,990 --> 00:02:42,870 >> 否则,如果针小于 的中间值,那么这意味着我们 50 00:02:42,870 --> 00:02:47,280 可以丢弃的右半边,只是 搜索数组的左侧。 51 00:02:47,280 --> 00:02:51,090 否则,我们将搜索 右侧的数组。 52 00:02:51,090 --> 00:02:54,410 并在结束时,如果你没有任何 留下来搜索更多的元素,但你 53 00:02:54,410 --> 00:02:58,050 有没有发现你的针还没有,那么你 返回false,因为针 54 00:02:58,050 --> 00:03:01,890 绝对不是在草堆。 55 00:03:01,890 --> 00:03:05,270 >> 现在,一个整洁的事关于这个伪代码 在二分搜索的是,它可以是 56 00:03:05,270 --> 00:03:09,940 解释为一种迭代 或递归实现。 57 00:03:09,940 --> 00:03:13,810 因此,这将是递归的,如果你叫 在搜索中的搜索功能 58 00:03:13,810 --> 00:03:17,350 功能上无论是数组的一半。 59 00:03:17,350 --> 00:03:21,030 在一个稍后我们将介绍递归 当然,但知道它是一个 60 00:03:21,030 --> 00:03:24,190 如果你想尝试的选择。 61 00:03:24,190 --> 00:03:26,030 >> 现在,让我们来看看排序。 62 00:03:26,030 --> 00:03:30,750 排序需要一个数组和整数 n,它是该数组的大小。 63 00:03:30,750 --> 00:03:34,030 现在有各种不同类型的 不爽,你可以看一些 64 00:03:34,030 --> 00:03:36,370 短裤的演示和讲解。 65 00:03:36,370 --> 00:03:39,580 返回类型我们 排序功能是无效的。 66 00:03:39,580 --> 00:03:43,580 这样就意味着我们不会 从排序返回任何数组。 67 00:03:43,580 --> 00:03:48,140 我们究竟要改很 被传递到我们的数组。 68 00:03:48,140 --> 00:03:52,290 >> 那是可能的,因为数组是 通过在C引用传递现在,我们将 69 00:03:52,290 --> 00:03:55,290 看到后面会详细讲解,但 通过本质区别 70 00:03:55,290 --> 00:03:59,340 在像整数和传球 在一个数组中,就是当你 71 00:03:59,340 --> 00:04:03,490 传递一个整数,C只是要 使该整数的副本,并通过 72 00:04:03,490 --> 00:04:04,450 它的功能。 73 00:04:04,450 --> 00:04:08,530 原来的变量不会被改变 一旦该功能被完成。 74 00:04:08,530 --> 00:04:12,480 与阵列,在另一方面,它的 不会让一个副本,你会 75 00:04:12,480 --> 00:04:17,910 其实是可以编辑的 很数组本身。 76 00:04:17,910 --> 00:04:21,269 >> 所以,一种类型的排序是 选择排序。 77 00:04:21,269 --> 00:04:24,750 选择排序的工作原理是在开始 开始的时候,然后你遍历 78 00:04:24,750 --> 00:04:26,820 在找到的最小元素。 79 00:04:26,820 --> 00:04:30,710 然后你换了最小 元件与所述第一1。 80 00:04:30,710 --> 00:04:34,360 然后移动到第二个元素 ,找到下一个最小的 81 00:04:34,360 --> 00:04:38,320 元素,然后交换与该 阵列中的第二个因素,因为 82 00:04:38,320 --> 00:04:41,100 第一个元素已经排序。 83 00:04:41,100 --> 00:04:45,370 所以,你继续为每 在确定的最小元素 84 00:04:45,370 --> 00:04:47,690 价值和交换出来。 85 00:04:47,690 --> 00:04:53,460 >> 对于我等于0,第一个元素 到n减1,你要比较 86 00:04:53,460 --> 00:04:57,820 之后,每一个未来的价值,并找到 最小值的索引。 87 00:04:57,820 --> 00:05:02,520 一旦你找到的最小值指数, 您可以交换数组的值 88 00:05:02,520 --> 00:05:05,930 最小和数组一 89 00:05:05,930 --> 00:05:09,760 >> 另一种类型的排序,你可以 落实是冒泡排序。 90 00:05:09,760 --> 00:05:14,380 因此,冒泡排序遍历列表 比较相邻元素和 91 00:05:14,380 --> 00:05:17,720 交换的元素 是在错误的顺序。 92 00:05:17,720 --> 00:05:22,380 并且以此方式,最大元件 将泡沫到底。 93 00:05:22,380 --> 00:05:28,070 和列表进行排序,一旦没有更多的 元素已经被调换。 94 00:05:28,070 --> 00:05:31,920 >> 因此,这些都是样的两个例子 您可以为实现算法 95 00:05:31,920 --> 00:05:33,230 find程序。 96 00:05:33,230 --> 00:05:37,350 一旦您完成排序,而你 做搜索,你就完蛋了。 97 00:05:37,350 --> 00:05:39,720 我的名字是Zamyla,这是CS50。 98 00:05:39,720 --> 00:05:46,987 >> [音乐播放]