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 لا تقلق بشأن هذا التفصيل إذا كنت لم أر تدوين يا كبير حتى الآن، ولكن 14 00:00:36,650 --> 00:00:39,730 فرز سريع هو O (ن تربيع) خوارزمية في أسوأ الأحوال، تماما مثل 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 (ن ن تسجيل،) ن لأننا يجب أن نفعل ن ناقص 1 106 00:04:57,500 --> 00:05:01,640 مقارنات على كل جيل وسجل ن لأن لدينا لتقسيم القائمة 107 00:05:01,640 --> 00:05:03,210 تسجيل مرات ن. 108 00:05:03,210 --> 00:05:06,160 ومع ذلك، في أسوأ الحالات، وهذا خوارزمية يمكن أن يكون في الواقع يا (ن 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 مرة وصنع ن ناقص 1 112 00:05:15,870 --> 00:05:17,690 مقارنات في كل مرة واحدة. 113 00:05:17,690 --> 00:05:20,490 وبالتالي، س ن المربعة. 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 وقت التشغيل من أي وقت مضى في الواقع س ن المربعة. 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 >> سرور 1: حقا؟ 129 00:06:03,200 --> 00:06:04,850 >> المتحدث 2: لا تتوقف عند هذا الحد. 130 00:06:04,850 --> 00:06:06,100 >> سرور 1: حقا؟ 131 00:06:06,100 --> 00:06:08,491