1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: سلام، من مارک هستم Grozen اسمیت، و این مرتب سازی سریع می باشد. 3 00:00:10,390 --> 00:00:13,520 درست مانند مرتب سازی بر درج و حباب مرتب کردن، مرتب سازی سریع یک الگوریتم برای است 4 00:00:13,520 --> 00:00:15,720 مرتب سازی یک لیست یا آرایه ای از همه چیز. 5 00:00:15,720 --> 00:00:19,080 برای سادگی، اجازه دهید فرض کنیم که کسانی که همه چیز فقط اعداد صحیح، اما 6 00:00:19,080 --> 00:00:22,060 می دانیم که مرتب سازی سریع برای کار بیش از اعداد. 7 00:00:22,060 --> 00:00:24,720 کلید شروع سریع است کمی پیچیده تر است از درج و یا حباب است، اما 8 00:00:24,720 --> 00:00:27,560 همچنین بسیار کارآمد تر در اکثر موارد. 9 00:00:27,560 --> 00:00:28,150 صبر کن یک لحظه. 10 00:00:28,150 --> 00:00:30,760 آیا او فقط می گویند "ترین موارد، "نه" همه "؟ 11 00:00:30,760 --> 00:00:31,710 جالب توجه است، هیچ. 12 00:00:31,710 --> 00:00:33,560 همه موارد یکسان است. 13 00:00:33,560 --> 00:00:36,650 آیا در مورد این جزئیات نگران نباشید اگر شما را دیده اند، نه نماد O بزرگ است، اما 14 00:00:36,650 --> 00:00:39,730 مرتب سازی سریع O (n مربع) الگوریتم است در بدترین حالت، درست مثل 15 00:00:39,730 --> 00:00:41,430 درج و یا مرتب سازی حبابی. 16 00:00:41,430 --> 00:00:44,950 با این حال، به طور معمول عمل می کند خیلی بیشتر مثل یک آنالوگ متر الگوریتم های قدیمی. 17 00:00:44,950 --> 00:00:45,750 چرا؟ 18 00:00:45,750 --> 00:00:46,810 ما به آن بعد دریافت کنید. 19 00:00:46,810 --> 00:00:49,610 اما در حال حاضر، اجازه دهید فقط یادگیری چگونه کار می کند مرتب سازی سریع. 20 00:00:49,610 --> 00:00:53,080 >> بنابراین اجازه دهید از طریق Quicksorting این راه رفتن آرایه ای از اعداد صحیح از کوچکترین 21 00:00:53,080 --> 00:00:54,260 به بزرگترین. 22 00:00:54,260 --> 00:01:00,110 در اینجا ما باید اعداد صحیح 6، 5، 1، 3، 8، 4، 7، 9، و 2. 23 00:01:00,110 --> 00:01:03,480 اول، ما عنصر نهایی انتخاب کنید این آرایه - در این مورد، دو - 24 00:01:03,480 --> 00:01:06,870 و تماس که "محور." بعد، ما شروع به در دو چیز نگاه - 25 00:01:06,870 --> 00:01:10,220 یک، پایین ترین شاخص، که من مراجعه کنید به عنوان ماندن در سمت راست 26 00:01:10,220 --> 00:01:13,970 دیوار، و، دو، سمت چپ عنصر که من "در حال حاضر تماس بگیرید 27 00:01:13,970 --> 00:01:17,260 عنصر. "آنچه ما قصد انجام است نگاه تمام عناصر دیگر، دیگر 28 00:01:17,260 --> 00:01:20,930 از محور، قرار داده و تمام عناصر کوچکتر از محور به 29 00:01:20,930 --> 00:01:24,140 سمت چپ از دیوار و تمام کسانی که بزرگتر از محوری به 30 00:01:24,140 --> 00:01:25,570 حق دیوار. 31 00:01:25,570 --> 00:01:29,560 سپس، در نهایت، ما به محور رها درست در آن دیوار به آن را بین 32 00:01:29,560 --> 00:01:32,970 تمام اعداد کوچکتر از آن و تمام اعداد بزرگتر. 33 00:01:32,970 --> 00:01:34,460 >> بنابراین اجازه دهید کار را انجام دهید. 34 00:01:34,460 --> 00:01:38,540 انتخاب کنید تا 2، قرار دادن دیوار در در آغاز، تماس گرفته و 6 "در حال حاضر 35 00:01:38,540 --> 00:01:41,590 عنصر. "بنابراین ما می خواهیم به نگاه عنصر فعلی ما، 6. 36 00:01:41,590 --> 00:01:44,200 و از آن بزرگتر از 2، ما آن را ترک وجود دارد به 37 00:01:44,200 --> 00:01:45,610 حق دیوار. 38 00:01:45,610 --> 00:01:48,980 سپس، ما در حرکت به در 5 عنوان نگاه ما عنصر فعلی و ببینید که این 39 00:01:48,980 --> 00:01:51,840 است، دوباره، بزرگتر از محور، بنابراین ما ترک آن را که در آن در سمت راست است 40 00:01:51,840 --> 00:01:53,190 طرف دیوار. 41 00:01:53,190 --> 00:01:53,880 ما در حرکت می کند. 42 00:01:53,880 --> 00:01:56,750 عنصر فعلی ما این است که در حال حاضر 1 و - آه. 43 00:01:56,750 --> 00:01:58,030 این در حال حاضر متفاوت است. 44 00:01:58,030 --> 00:02:00,890 این عنصر در حال حاضر در حال حاضر کوچکتر از محور، به طوری که ما می خواهیم آن را 45 00:02:00,890 --> 00:02:02,570 در سمت چپ دیوار. 46 00:02:02,570 --> 00:02:06,555 برای این کار، اجازه دهید فقط تغییر دهید عنصر فعلی با کمترین شاخص 47 00:02:06,555 --> 00:02:07,970 نشسته فقط به سمت راست از دیوار. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 در حال حاضر، ما حرکت به دیوار تا یک شاخص به طوری که 1 است در سمت چپ 50 00:02:17,570 --> 00:02:19,750 طرف دیوار در حال حاضر. 51 00:02:19,750 --> 00:02:20,310 >> صبر کنید. 52 00:02:20,310 --> 00:02:23,450 من فقط مخلوط کردن عناصر در سمت راست دیوار، آیا من نیست؟ 53 00:02:23,450 --> 00:02:23,890 نگران نباشید. 54 00:02:23,890 --> 00:02:24,930 این خوب است. 55 00:02:24,930 --> 00:02:27,570 تنها چیزی که ما در مورد در حال حاضر مراقبت این است که همه این عناصر به 56 00:02:27,570 --> 00:02:29,570 حق دیوار بزرگتر است از محوری. 57 00:02:29,570 --> 00:02:31,760 بدون منظور واقعی در نظر گرفته نشده است. 58 00:02:31,760 --> 00:02:33,200 >> در حال حاضر، دوباره به مرتب سازی. 59 00:02:33,200 --> 00:02:35,840 بنابراین ما در به دنبال در ادامه بقیه عناصر. 60 00:02:35,840 --> 00:02:39,075 و در این مورد، ما می بینیم که وجود دارد هیچ یک از عناصر دیگر کمتر از 61 00:02:39,075 --> 00:02:42,100 محوری، بنابراین ما همه آنها را در ترک در سمت راست دیوار. 62 00:02:42,100 --> 00:02:45,980 در نهایت، ما به عنصر فعلی را دریافت کنید و دیدن آن است که سطح محوری است. 63 00:02:45,980 --> 00:02:48,830 در حال حاضر، که بدان معنی است که ما دو بخش آرایه، اولین بودن 64 00:02:48,830 --> 00:02:51,820 کوچک در محور و در سمت چپ از دیوار، و وجود دوم 65 00:02:51,820 --> 00:02:54,500 بزرگتر از محوری به سمت راست دیوار. 66 00:02:54,500 --> 00:02:57,040 ما می خواهیم برای قرار دادن عنصر محوری بین این دو، و پس از آن ما می دانیم 67 00:02:57,040 --> 00:03:01,000 که سطح محوری است در حق خود محل نهایی مرتب شده است. 68 00:03:01,000 --> 00:03:04,980 بنابراین ما این عنصر برای اولین بار در سوئیچ سمت راست دیوار با سطح محوری، 69 00:03:04,980 --> 00:03:06,410 و ما می دانیم که سطح محوری است در سمت راست آن است. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> سپس ما این روند تکرار برای subarrays چپ و راست محور. 72 00:03:15,650 --> 00:03:18,700 از آنجا که آخرین subarray تنها یک است عنصر طولانی، ما می دانیم که در حال حاضر 73 00:03:18,700 --> 00:03:22,480 مرتب زیرا چگونه می تواند شما را از می شود سفارش اگر شما تنها یک عنصر هستید؟ 74 00:03:22,480 --> 00:03:28,860 در سمت راست subarray ما می بینیم که محور 5 دیوار است، و 75 00:03:28,860 --> 00:03:32,250 است که فقط از 6 به سمت چپ. 76 00:03:32,250 --> 00:03:34,970 و عنصر فعلی نیز شروع می شود به عنوان 6. 77 00:03:34,970 --> 00:03:36,200 پس 6 بزرگتر از 5 باشد. 78 00:03:36,200 --> 00:03:38,590 ما آن را ترک که در آن در است سمت راست دیوار. 79 00:03:38,590 --> 00:03:41,060 در حال حاضر، در حال حرکت، 3 کمتر از 5 است. 80 00:03:41,060 --> 00:03:44,160 بنابراین ما آن را با عنصر اول تغییر دهید درست و مناسب از دیوار. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 در حال حاضر، من دیوار به یک نقل مکان کرد. 83 00:03:50,750 --> 00:03:53,010 در حال حاضر، در حال حرکت به 8. 84 00:03:53,010 --> 00:03:56,480 8 بزرگتر از 5 باشد، و بنابراین ما آن را ترک کنند. 85 00:03:56,480 --> 00:03:58,720 4 کمتر از 5، بنابراین ما آن را تغییر دهید. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 و در. 88 00:04:03,570 --> 00:04:04,820 و در. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> هر بار که فرایند تکرار در طرف چپ و راست از آرایه. ما 91 00:04:13,670 --> 00:04:17,010 یک مفصل را انتخاب کنید و انجام مقایسه ها و ایجاد سطح دیگری از چپ و 92 00:04:17,010 --> 00:04:18,240 subarrays راست. 93 00:04:18,240 --> 00:04:21,500 این تماس بازگشتی تا زمانی ادامه خواهد داد ما به پایان زمانی که ما کرده ایم 94 00:04:21,500 --> 00:04:25,290 آرایه کلی تقسیم می شوند تا به فقط subarrays طول 1. 95 00:04:25,290 --> 00:04:28,060 از آنجا، ما می دانیم که آرایه طبقه بندی شده اند زیرا هر عنصر، در 96 00:04:28,060 --> 00:04:29,330 برخی از نقطه، یک محور. 97 00:04:29,330 --> 00:04:32,720 به عبارت دیگر، برای هر عنصر، همه اعداد به سمت چپ و کمتر 98 00:04:32,720 --> 00:04:36,420 ارزش ها و تمام اعداد به حق دارند ارزش بیشتر است. 99 00:04:36,420 --> 00:04:38,980 >> این روش به خوبی کار می کند در صورتی که ارزش محوری انتخاب شده است 100 00:04:38,980 --> 00:04:41,930 تقریبا در وسط طیف وسیعی از مقادیر لیست. 101 00:04:41,930 --> 00:04:45,630 به این معنی که بعد از حرکت ما عناصر اطراف، وجود دارد در مورد به عنوان بسیاری از 102 00:04:45,630 --> 00:04:48,390 عناصر در سمت چپ محور به سمت راست وجود دارد. 103 00:04:48,390 --> 00:04:52,380 و ماهیت تقسیم و تسخیر از الگوریتم مرتب سازی سریع است و سپس گرفته 104 00:04:52,380 --> 00:04:53,850 استفاده کامل از. 105 00:04:53,850 --> 00:04:57,500 این یک زمان اجرا از O (n log n استفاده،) N به خاطر ما باید انجام دهیم N منهای 1 106 00:04:57,500 --> 00:05:01,640 مقایسه در هر نسل و ورود به سیستم N چرا که ما به تقسیم فهرست 107 00:05:01,640 --> 00:05:03,210 ورود برپایه نفر. 108 00:05:03,210 --> 00:05:06,160 با این حال، در بدترین موارد، این الگوریتم در واقع می تواند O (n است 109 00:05:06,160 --> 00:05:09,850 مربع.) فرض کنید در هر نسل، محور خیلی اتفاق می افتد می شود 110 00:05:09,850 --> 00:05:12,520 کوچکترین و بزرگترین تعداد ما در حال مرتب سازی. 111 00:05:12,520 --> 00:05:15,870 این به معنی شکستن در فهرست n بار و ساخت N منهای 1 112 00:05:15,870 --> 00:05:17,690 مقایسه هر بار تنها. 113 00:05:17,690 --> 00:05:20,490 بنابراین، O از N مربع. 114 00:05:20,490 --> 00:05:22,000 >> چگونه می توان بهبود روش؟ 115 00:05:22,000 --> 00:05:25,100 یک راه خوب برای بهبود روش برای کاهش احتمال این که 116 00:05:25,100 --> 00:05:28,150 زمان اجرا است که تا کنون در واقع O از N مربع. 117 00:05:28,150 --> 00:05:31,860 به یاد داشته باشید این بدترین، بدترین سناریو مورد فقط می تواند رخ دهد هنگامی که 118 00:05:31,860 --> 00:05:35,320 محور انتخاب شده است همیشه بالاترین و یا کمترین مقدار در آرایه. 119 00:05:35,320 --> 00:05:38,630 برای اطمینان از این است به احتمال زیاد کمتر اتفاق می افتد، ما می توانیم محوری توسط پیدا 120 00:05:38,630 --> 00:05:42,610 انتخاب عناصر متعدد و مصرف مقدار متوسط. 121 00:05:42,610 --> 00:05:44,650 >> نام من علامت Grozen اسمیت است، و این CS50 است. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> برای سادگی، اجازه دهید فرض کنیم که کسانی که همه چیز فقط اعداد صحیح، اما 124 00:05:50,930 --> 00:05:51,970 می دانیم که Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert؟ 126 00:05:53,160 --> 00:05:55,200 متأسفم. 127 00:05:55,200 --> 00:06:02,000 >> در اینجا ما باید اعداد صحیح 6، 5، 1، 3، 8، 4، 9. 128 00:06:02,000 --> 00:06:03,200 >> SPEAKER: 1: واقعا؟ 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: آیا جا ختم نشد. 130 00:06:04,850 --> 00:06:06,100 >> SPEAKER 1: واقعا؟ 131 00:06:06,100 --> 00:06:08,491