1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: Hi, aku Mark Grozen-Smith, dan ini adalah Quicksort. 3 00:00:10,390 --> 00:00:13,520 Sama seperti insertion sort dan bubble sort, Quicksort adalah algoritma untuk 4 00:00:13,520 --> 00:00:15,720 menyortir daftar atau array hal. 5 00:00:15,720 --> 00:00:19,080 Untuk mempermudah, mari kita asumsikan bahwa mereka hal-hal yang hanya bilangan bulat, tapi 6 00:00:19,080 --> 00:00:22,060 tahu bahwa Quicksort bekerja untuk lebih dari sekedar angka. 7 00:00:22,060 --> 00:00:24,720 Quickstart adalah sedikit lebih rumit dari penyisipan atau gelembung, tapi itu 8 00:00:24,720 --> 00:00:27,560 juga jauh lebih efisien dalam banyak kasus. 9 00:00:27,560 --> 00:00:28,150 Tunggu sebentar. 10 00:00:28,150 --> 00:00:30,760 Apakah dia hanya mengatakan "sebagian besar kasus, "tidak" semua "? 11 00:00:30,760 --> 00:00:31,710 Menariknya, tidak ada. 12 00:00:31,710 --> 00:00:33,560 Tidak semua kasus yang sama. 13 00:00:33,560 --> 00:00:36,650 Jangan khawatir tentang detail ini jika Anda belum melihat notasi O besar, tapi 14 00:00:36,650 --> 00:00:39,730 Quicksort adalah O (n kuadrat) algoritma paling buruk, seperti 15 00:00:39,730 --> 00:00:41,430 penyisipan atau bubble sort. 16 00:00:41,430 --> 00:00:44,950 Namun, biasanya bertindak jauh lebih seperti algoritma m analog tua. 17 00:00:44,950 --> 00:00:45,750 Mengapa? 18 00:00:45,750 --> 00:00:46,810 Kita akan kembali nanti. 19 00:00:46,810 --> 00:00:49,610 Tapi untuk saat ini, mari kita belajar bagaimana Quicksort bekerja. 20 00:00:49,610 --> 00:00:53,080 >> Jadi mari kita berjalan melalui Quicksorting ini array bilangan bulat dari terkecil 21 00:00:53,080 --> 00:00:54,260 ke terbesar. 22 00:00:54,260 --> 00:01:00,110 Di sini kita memiliki bilangan bulat 6, 5, 1, 3, 8, 4, 7, 9, dan 2. 23 00:01:00,110 --> 00:01:03,480 Pertama, kita memilih elemen terakhir dari array ini - dalam kasus ini, dua - 24 00:01:03,480 --> 00:01:06,870 dan menyebutnya sebagai "poros." Selanjutnya, kita mulai melihat dua hal - 25 00:01:06,870 --> 00:01:10,220 satu, indeks terendah, yang saya akan merujuk sebagai tinggal di sebelah kanan 26 00:01:10,220 --> 00:01:13,970 dinding, dan, dua, paling kiri elemen, yang saya akan menelepon "saat ini 27 00:01:13,970 --> 00:01:17,260 elemen. "Apa yang kami akan lakukan adalah melihat semua elemen lain, lain 28 00:01:17,260 --> 00:01:20,930 dari poros, dan menempatkan semua elemen lebih kecil dari pivot ke 29 00:01:20,930 --> 00:01:24,140 kiri dinding dan semua orang lebih besar dari pivot ke 30 00:01:24,140 --> 00:01:25,570 kanan dinding. 31 00:01:25,570 --> 00:01:29,560 Kemudian, akhirnya, kita akan menjatuhkan poros tepat di dinding itu untuk meletakkannya di antara 32 00:01:29,560 --> 00:01:32,970 semua angka yang lebih kecil daripada dan semua angka yang lebih besar. 33 00:01:32,970 --> 00:01:34,460 >> Jadi mari kita lakukan itu. 34 00:01:34,460 --> 00:01:38,540 Angkat 2, menempatkan dinding di dimulai, dan memanggil 6 "saat ini 35 00:01:38,540 --> 00:01:41,590 elemen. "Jadi kita ingin melihat elemen saat kami, 6. 36 00:01:41,590 --> 00:01:44,200 Dan karena itu lebih besar dari 2, kami meninggalkannya di sana untuk 37 00:01:44,200 --> 00:01:45,610 kanan dinding. 38 00:01:45,610 --> 00:01:48,980 Kemudian, kita beralih ke melihat 5 sebagai kami elemen saat ini dan melihat bahwa ini 39 00:01:48,980 --> 00:01:51,840 adalah, sekali lagi, lebih besar dari pivot, jadi kami meninggalkan di tempat itu adalah di sebelah kanan 40 00:01:51,840 --> 00:01:53,190 sisi dinding. 41 00:01:53,190 --> 00:01:53,880 Kami melanjutkan. 42 00:01:53,880 --> 00:01:56,750 Elemen kami saat ini adalah sekarang 1, dan - oh. 43 00:01:56,750 --> 00:01:58,030 Ini berbeda sekarang. 44 00:01:58,030 --> 00:02:00,890 Elemen saat sekarang lebih kecil dari poros, jadi kami ingin meletakkannya 45 00:02:00,890 --> 00:02:02,570 di sebelah kiri dinding. 46 00:02:02,570 --> 00:02:06,555 Untuk melakukan hal ini, mari kita beralih elemen saat ini dengan indeks terendah 47 00:02:06,555 --> 00:02:07,970 duduk tepat di sebelah kanan dinding. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Sekarang, kita bergerak dinding sampai satu indeks sehingga 1 adalah di sebelah kiri 50 00:02:17,570 --> 00:02:19,750 sisi dinding sekarang. 51 00:02:19,750 --> 00:02:20,310 >> Tunggu. 52 00:02:20,310 --> 00:02:23,450 Aku hanya mencampur-adukkan elemen pada sisi kanan dinding, bukan? 53 00:02:23,450 --> 00:02:23,890 Jangan khawatir. 54 00:02:23,890 --> 00:02:24,930 Itu baik-baik saja. 55 00:02:24,930 --> 00:02:27,570 Satu-satunya hal yang kita peduli untuk saat ini adalah bahwa semua elemen tersebut ke 56 00:02:27,570 --> 00:02:29,570 kanan dinding lebih besar dari poros. 57 00:02:29,570 --> 00:02:31,760 Tidak ada urutan yang sebenarnya diasumsikan belum. 58 00:02:31,760 --> 00:02:33,200 >> Sekarang, kembali ke penyortiran. 59 00:02:33,200 --> 00:02:35,840 Jadi kita lanjutkan melihat sisa elemen. 60 00:02:35,840 --> 00:02:39,075 Dan dalam hal ini, kita melihat bahwa ada tidak ada unsur-unsur lain kurang dari 61 00:02:39,075 --> 00:02:42,100 poros, jadi kami meninggalkan mereka semua di sisi kanan dinding. 62 00:02:42,100 --> 00:02:45,980 Akhirnya, kita sampai elemen saat ini dan melihat bahwa itu adalah poros. 63 00:02:45,980 --> 00:02:48,830 Sekarang, itu berarti bahwa kita memiliki dua bagian dari array, yang pertama adalah 64 00:02:48,830 --> 00:02:51,820 kecil di poros dan di sisi kiri dinding, dan yang kedua adalah 65 00:02:51,820 --> 00:02:54,500 lebih besar dari pivot ke sisi kanan dinding. 66 00:02:54,500 --> 00:02:57,040 Kami ingin menempatkan elemen poros antara dua, dan kemudian kita akan tahu 67 00:02:57,040 --> 00:03:01,000 bahwa poros dalam haknya akhir tempat diurutkan. 68 00:03:01,000 --> 00:03:04,980 Jadi kita beralih elemen pertama pada sisi kanan dinding dengan poros, 69 00:03:04,980 --> 00:03:06,410 dan kita tahu pivot ini dalam posisi yang tepat. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Kami kemudian ulangi proses ini untuk subarrays kiri dan kanan dari poros. 72 00:03:15,650 --> 00:03:18,700 Karena subarray terakhir adalah satu-satunya elemen panjang, kita tahu bahwa sudah 73 00:03:18,700 --> 00:03:22,480 diurutkan karena bagaimana Anda bisa keluar dari memesan jika Anda hanya satu elemen? 74 00:03:22,480 --> 00:03:28,860 Untuk sisi kanan subarray, kita melihat bahwa poros adalah 5, dan dinding 75 00:03:28,860 --> 00:03:32,250 hanya tersisa dari 6. 76 00:03:32,250 --> 00:03:34,970 Dan elemen saat ini juga mulai keluar sebagai 6. 77 00:03:34,970 --> 00:03:36,200 Jadi 6 lebih besar dari 5. 78 00:03:36,200 --> 00:03:38,590 Kami meninggalkan tempat itu pada sisi kanan dinding. 79 00:03:38,590 --> 00:03:41,060 Sekarang, pindah, 3 kurang dari 5. 80 00:03:41,060 --> 00:03:44,160 Jadi kita beralih dengan elemen pertama tepat dari dinding. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Sekarang, aku pindah dinding sampai satu. 83 00:03:50,750 --> 00:03:53,010 Sekarang, pindah ke 8. 84 00:03:53,010 --> 00:03:56,480 8 lebih besar dari 5, dan jadi kami meninggalkannya. 85 00:03:56,480 --> 00:03:58,720 4 kurang dari 5, jadi kita aktifkan. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 Dan di. 88 00:04:03,570 --> 00:04:04,820 Dan di. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Setiap kali kita ulangi proses di sisi kiri dan kanan dari array. kami 91 00:04:13,670 --> 00:04:17,010 memilih pivot dan melakukan perbandingan dan menciptakan tingkat lain dari kiri dan 92 00:04:17,010 --> 00:04:18,240 subarrays tepat. 93 00:04:18,240 --> 00:04:21,500 Panggilan rekursif ini akan berlanjut sampai kita mencapai akhir ketika kita sudah 94 00:04:21,500 --> 00:04:25,290 dibagi array keseluruhan menjadi hanya subarrays panjang 1. 95 00:04:25,290 --> 00:04:28,060 Dari sana, kita tahu array diurutkan karena setiap elemen memiliki, 96 00:04:28,060 --> 00:04:29,330 beberapa titik, menjadi pivot. 97 00:04:29,330 --> 00:04:32,720 Dengan kata lain, untuk setiap elemen, semua angka di sebelah kiri adalah lebih rendah 98 00:04:32,720 --> 00:04:36,420 nilai-nilai dan semua nomor ke benar memiliki nilai yang lebih besar. 99 00:04:36,420 --> 00:04:38,980 >> Metode ini bekerja sangat baik jika nilai pivot yang dipilih adalah 100 00:04:38,980 --> 00:04:41,930 kira-kira di tengah rentang nilai daftar. 101 00:04:41,930 --> 00:04:45,630 Ini berarti bahwa, setelah kami pindah elemen sekitar, ada sekitar sebanyak 102 00:04:45,630 --> 00:04:48,390 elemen di sebelah kiri poros karena ada di sebelah kanan. 103 00:04:48,390 --> 00:04:52,380 Dan sifat membagi-dan-menaklukkan dari Algoritma Quicksort kemudian diambil 104 00:04:52,380 --> 00:04:53,850 keuntungan penuh dari. 105 00:04:53,850 --> 00:04:57,500 Hal ini menciptakan runtime dari O (n log n,) n karena harus kita lakukan n dikurangi 1 106 00:04:57,500 --> 00:05:01,640 perbandingan pada setiap generasi dan log n karena kita harus membagi daftar 107 00:05:01,640 --> 00:05:03,210 log n kali. 108 00:05:03,210 --> 00:05:06,160 Namun, dalam kasus-kasus terburuk, ini Algoritma sebenarnya bisa O (n 109 00:05:06,160 --> 00:05:09,850 kuadrat.) Misalkan pada setiap generasi, poros kebetulan menjadi 110 00:05:09,850 --> 00:05:12,520 terkecil atau terbesar dari nomor kita penyortiran. 111 00:05:12,520 --> 00:05:15,870 Ini berarti mogok daftar n kali dan pengambilan n dikurangi 1 112 00:05:15,870 --> 00:05:17,690 perbandingan setiap saat. 113 00:05:17,690 --> 00:05:20,490 Dengan demikian, o n kuadrat. 114 00:05:20,490 --> 00:05:22,000 >> Bagaimana kita bisa meningkatkan metode? 115 00:05:22,000 --> 00:05:25,100 Salah satu cara yang baik untuk meningkatkan metode ini untuk mengurangi probabilitas bahwa 116 00:05:25,100 --> 00:05:28,150 runtime yang pernah benar-benar o n kuadrat. 117 00:05:28,150 --> 00:05:31,860 Ingat, skenario terburuk terburuk ini hanya dapat terjadi ketika 118 00:05:31,860 --> 00:05:35,320 poros yang dipilih adalah selalu yang tertinggi atau nilai terendah dalam array. 119 00:05:35,320 --> 00:05:38,630 Untuk memastikan hal ini kurang mungkin terjadi, kita dapat menemukan poros dengan 120 00:05:38,630 --> 00:05:42,610 memilih beberapa elemen dan mengambil nilai median. 121 00:05:42,610 --> 00:05:44,650 >> Nama saya adalah Mark Grozen-Smith, dan ini adalah CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Untuk mempermudah, mari kita asumsikan bahwa mereka hal-hal yang hanya bilangan bulat, tapi 124 00:05:50,930 --> 00:05:51,970 tahu bahwa Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Maaf. 127 00:05:55,200 --> 00:06:02,000 >> Di sini kita memiliki bilangan bulat 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> SPEAKER 1: Benarkah? 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: Jangan berhenti di situ. 130 00:06:04,850 --> 00:06:06,100 >> SPEAKER 1: Benarkah? 131 00:06:06,100 --> 00:06:08,491