מיון (sorting) קלט : מערך בן n מספרים. פלט : מערך ובו המספרים...
Post on 18-Dec-2015
259 views
TRANSCRIPT
( Sorting )מיון
מספרים. n: מערך בן קלט
מאוחסנים בסדר אותם: מערך ובו המספרים פלטעולה.
12 31 1 5 6 11 41 16 3 19 44 23 93 564 99712 31 1 5 6 11 41 16 3 19 44 23 93 564 997
BubbleSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
for )i=0; i<n-1; i++({for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
j=15
swap )&a[j],&a[j+1](; }}
n=17
BubbleSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
j=14
swap )&a[j],&a[j+1](; }}
BubbleSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
j=13
swap )&a[j],&a[j+1](; }}
BubbleSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
swap )&a[j],&a[j+1](; }}
BubbleSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
swap )&a[j],&a[j+1](; }}
BubbleSort
12 31 1 5 6 11 41 163 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](
i=0
swap )&a[j],&a[j+1](; }}
אבר מינימאלי
i=1
BubbleSort
12 311 5 6 11 41 163 19 44 23 93 564 997
for )i=0; i<n-1; i++({
n=17
for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](swap )&a[j],&a[j+1](; }}
i=1
12 311 5 6 11 41 163 19 4423 93564 997
for )i=0; i<n-1; i++({for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](swap )&a[j],&a[j+1](; }}
אבר מינימאלי שני
for )i=0; i<n-1; i++({for )j=n-2; j>=i; j--({
If )a[j] > a[j+1](swap )&a[j],&a[j+1](; }}
12 311 5 6 11 41 163 19 4423 93564 997
i= 0,1,…,n-2j= n-2,n-3,…,iO(1)
O(1)
2
0
1)2(n
i
in
2
0
1n
i
in
1
1
n
k
k
2
)1( nn )( 2nO
סיבוכיות מקום נוסף)1(O
סיבוכיות זמן
BubbleSort
סיבוכיות זמן
סיבוכיות מקוםנוסף
)( 2nO
)1(O
HeapSort הוא מבנה נתונים המוגדר ע"י הפעולות הבאות:תור עדיפויות
-MakeHeap(Q)צור ערימה ריקה 1.
Insert(x,Q) לערימה - xהכנס רשומה 2.
Max(Q)הדפס את הרשומה עם המפתח הגדול ביותר - 3.
DeleteMax(Q)הוצא את הרשומה עם המפתח הגדול ביותר - 4.
1.MakeHeap)Q(2. for )i=0 ;i=n-1;i++( Insert)A[i],Q(3. for )i=n-1;i=0;i--( 4. {A[i]=Max)Q(; DeleteMax)Q(}
1.MakeHeap)Q(2. for )i=0 ;i=n-1;i++( Insert)A[i],Q(3. for )i=n-1;i=0;i--( 4. {A[i]=Max)Q(; DeleteMax)Q(}
סיבוכיות מקום נוסף
סיבוכיות זמןO(1)O(n log n)O(n log n)
O(n log n)
O(n)
BubbleSort
סיבוכיות זמן
סיבוכיות מקוםנוסף
)( 2nO
)1(O
HeapSort
)log( nnO
( )O n
O(1) ?האם אפשר בסיבוכיות מקום
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
12 311 5 63 4 71 2 3 4 5 6 7 8
119
12 311 5 63 4 7 11
1
2 3
4 5 6 7
8 9
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
12 31
1
5 6
3 4
7 11
1
2 3
4 5 6 7
8 9
12
31
1
5
6
3 4
7
11
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
12
311
5
6
3 47
11
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
12 31
1 5
6
3 4
7
11
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
12 31
1 5
6
3
4
7
11
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
בסוף נקבל
12 31
1
5 6
3 4
7 11
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; \* X=A[1] *\ 4. DeleteMax)A(5. A[i]=X}
בסוף נקבל
12 31
1
5 6
3 4
7 11
1 2 3 4 5 6 7 8 9
1.MakeHeap)A(2. for )i=n;i=2;i--( 3. {X=Max)A(; 4. DeleteMax)A(5. A[i]=X}
סיבוכיות זמן
O(?)
O(log n)
O(n)
O(n log n)
O(1)
O(1)
סיבוכיות מקום נוסף
O(1)
12 31
1
5 6
3 4
7 11
MakeHeap
. נגש לתת-עץ של צמת שהוא לא עלה2
. כל עלה הוא תת-עץ ערימה1
. נבדוק אם הוא ערימה ז"א3
][]/2[ וגם ][]/12[ jAjAjAjA
1,,12/,2/ nnj
לתת העץ Sift-downאם לא תבציע j
4j
12 31
1
5 6
3 4
7 11
MakeHeap
. נגש לתת-עץ של צמת שהוא לא עלה2
. כל עלה הוא תת-עץ ערימה1
. נבדוק אם הוא ערימה ז"א3
][]/2[ וגם ][]/12[ jAjAjAjA
1,,12/,2/ nnj
לתת העץ Sift-downאם לא תבציע j
3j
12 31
1
5
63
4
7 11
MakeHeap
. נגש לתת-עץ של צמת שהוא לא עלה2
. כל עלה הוא תת-עץ ערימה1
. נבדוק אם הוא ערימה ז"א3
][]/2[ וגם ][]/12[ jAjAjAjA
1,,12/,2/ nnj
לתת העץ Sift-downאם לא תבציע j
2j
12
31
1
5
6
3 4
7 11
MakeHeap
. נגש לתת-עץ של צמת שהוא לא עלה2
. כל עלה הוא תת-עץ ערימה1
. נבדוק אם הוא ערימה ז"א3
][]2[ וגם ][]12[ jAjAjAjA
1,,12/,2/ nnj
לתת העץ Sift-downאם לא תבציע j
1j
MakeHeap
סיבוכיות זמן
1,,12/,2/ nnj
h1)1(2 h
)2(22 h
))1((2 hhh
MakeHeap
סיבוכיות זמן
))1((2)2(2)1(21 12 hhhhh h
hh h
22
3
2
2
2
12
32
hh h
22
3
2
2
2
12
32
h22 n2 )(nO
222
4
2
3
2
2
2
1432
h
h
32/1
32/116/1
32/116/18/1
32/116/18/14/1
32/116/18/14/12/1
1
2/1
4/1
2
2 3 4
1 2 3 4
2 2 2 2 2h
hL הוכחה שניה
2 3 2
1
1 1 1 1 1 1 2
2 2 2 2 2 2 2
1 1 1
2 2 2h h
L
h
2 3
1 1 1 1 1
2 2 2 2 2hL L
11
2L L 2L
BubbleSort
סיבוכיות זמן
סיבוכיות מקוםנוסף
)( 2nO
)1(O
HeapSort
)log( nnO
)(nO)1(O
QuickSort
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
41
Partition)a,1,17,pivot(
QuickSort)a,1,17(
13
=pivot
Choose-pivot
12 31 1 5 6 11 4116 3 19 4423 93 564 997
QuickSort)a,1,12(QuickSort)a,13,17(
QuickSort(Key *A, int left, int right) int i, j, p; if (left >= right) return ; p = choose_pivot(A,left,right); i = partition(A,left,right,p); QuickSort(A, left, i-1); QuickSort(A,i,right);
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
left right
41p=
12 31 1 5 6 11 4116 3 19 4423 93 564 997
i=13
12 311 5 6 11 163 19 234 7 41 44 93 56 99
Partition)A,left,right,p( i=left; j=right;while )A[i]<p( i++; while )A[j]>p( j--; if )i<=j( { swap)a[i],a[j](; i++; j--; }
nO)(סיבוכיות זמן
12 31 1 5 6 11 41 16 3 19 44 23 93 564 997
i j
QuickSortניתוח זמן של
)()()(
)1()1(
11 nnTnTcnnT
OT
Partition)A,1,n,pivot(
QuickSort)A,1,n(
QuickSort)A,1,n1( QuickSort)A, n1,n(
סיבוכיות זמן
סיבוכיות מקום נוסף)),(max()(
)1()1(
11 nnnScnS
OS
)()()(
)1()1(
11 nnTnTcnnT
OT
המקרה הגרוע
)1()1()( nTTcnnT
)1( nTcn
)2()1( ncnccn
)( 2nסבוכיות מקום נוסף
)),(max()(
)1()1(
11 nnnScnS
OS
)1( nSc )(n
סבוכיות זמן
)()()(
)1()1(
11 nnTnTcnnT
OT
המקרה הטוב
)2/()2/()( nTnTcnnT
)2/(2 nTcn
)2/(2 kk
k
nTcncncncn
)log( nn
סבוכיות מקום נוסף
)),(max()(
)1()1(
11 nnnScnS
OS
)2/(nSc )(log n
סבוכיות זמן
1
)()(
)(
)1()1(1
111
1
n
nnTnT
cnnT
OTn
n
המקרה הממוצע
נוסחת הנסיגה דומה לנוסחת הנסיגה למספר ההשוואות הנדרש לבניית עץ חיפוש בינרי אקראי. שיטת הפתרון זהה. פרטים בספר
8הלימוד, פרק .)log()( nnOnT
סבוכיות זמן
בחירה רנדומלית של ציר
1
))(),(max(
)(
)1()1(1
111
1
n
nnSnS
cnS
OSn
n
סבוכיות מקום נוסף ממוצע
פתרון
)(log)( nnS
BubbleSort
סיבוכיות זמן
סיבוכיות מקוםנוסף
)( 2nO
)1(O
HeapSort
)log( nnO
)1(O
QuickSort
)log( nnOממוצע
)(log nOממוצע
מדויק שיתן סבוכיות מקום נוסף QuickSortנראה ממוש ל-
)(log)( nOnS QuickSort(A, left, right)
while (left < right){
p = choose_pivot(A,left,right);
i = partition(a,left,right,p);
if (i-1 < right – i + 1)
QuickSort(A, left, i-1); left = i ;
else
QuickSort(A, i, right); right = i - 1 ;
i
left right
left right
)),(min()( 11 nnnScnS
)2/(nSc )(log)( nOnS
BubbleSort
סיבוכיות זמן
סיבוכיות מקוםנוסף
)( 2nO
)1(O
HeapSort
)log( nnO
)1(O
QuickSort
)log( nnOממוצע
)(log nOממוצע