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 >> [音樂播放]