1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: היי, אני מארק Grozen-סמית, וזה Quicksort. 3 00:00:10,390 --> 00:00:13,520 בדיוק כמו סוג הכנסה ואת הבועה למיין, Quicksort הוא אלגוריתם ל 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 יודע שQuicksort עובד עבור יותר מסתם מספרים. 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 Quicksort הוא 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 אבל לעת עתה, בואו פשוט ללמוד איך Quicksort עובד. 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 וטבע הפרד ומשול של אלגוריתם Quicksort מכן נלקח 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 להיכנס פעמים n. 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 >> 1 SPEAKER: באמת? 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: אל תעצור שם. 130 00:06:04,850 --> 00:06:06,100 >> 1 SPEAKER: באמת? 131 00:06:06,100 --> 00:06:08,491