Professional Documents
Culture Documents
Thuật Toán Sắp Xếp
Thuật Toán Sắp Xếp
Trong khoa hc my tnh v trong ton hc, mt thut ton sp xp l mt thut ton sp xp
cc phn t ca mt danh sch (hoc mt mng theo th t (tng hoc gim)). Ngi ta thng
xt trng hp cc phn t cn sp xp l cc s.
Bi ton sp xp c nhiu nh khoa hc quan tm.
Sp xp chn (selection sort) l phng php sp xp bng cch chn phn t b nht xp vo v
tr th nht, tng t vi cc phn t nh t
4.Sp xp trn
Sp xp nhanh (quicksort) l mt thut ton theo t tng chia tr, n da trn th tc phn
chia nh sau: chia mt dy ta chn mt phn t c gi l "cht" (pivot), chuyn tt c cc
phn t nh hn cht v trc cht, chuyn tt c cc phn t ln hn cht v sau n. Th tc
ny c th thc hin trong thi gian tuyn tnh. Tip tc phn chia cc dy con nh trn cho
n khi cc dy con ch cn mt phn t.
im khc bit gia sp xp nhanh v sp xp trn l trong sp xp trn vic xc nh th t
c xc nh khi "trn", tc l trong khu tng hp li gii sau khi cc bi ton con c
gii, cn sp xp nhanh quan tm n th t cc phn t khi phn chia mt danh sch thnh
hai danh sch con.
Ngoi ra cn nhiu gii thut sp xp khc, trong nhiu gii thut sp xp c ci tin t cc
gii thut trn. Trong sau gii thut lit k trn, ta thng coi cc gii thut chn, chn, ni bt l
cc gii thut c bn, phc tp trong trng hp trung bnh ca chng l O(n2). Ba gii thut
cn li thng c coi l gii thut cao cp, phc tp tnh ton trung bnh ca chng l n.lnn.
7.Sp xp theo c s
Sp xp theo c s (radix sort) da trn tnh cht "s" ca cc kha. Trong gii thut sp xp
theo c s, ta khng ch so snh gi tr ca cc kha, m so snh cc thnh phn ca kha. Gi s
cc kha l cc s biu din theo h ghi s c s M. Khi sp xp theo c s s so snh tng k
s ca n.
Chng ta m t cch sp ny khi c s M=10. Gi s phi sp cc h s nh s bi 3 ch s
thp phn. u tin ta chia cc h s vo cc ng c cng ch s hng trm (ng thi xp cc
ng theo th t ca ch s hng trm), trong mi ng con li phn chia theo ch s hng chc,
Bi 1:
Sp xp chn(Selection Sort)
1.T tng
Chn phn t nh nht trong n phn t ban u, a phn t ny v v tr ng l u tin ca
dy hin hnh. Sau khng quan tm n n na, xem dy hin hnh ch cn n-1 phn t ca
dy ban u, bt u t v tr th 2. Lp li qu trnh trn cho dy hin hnh n khi dy hin
hnh ch cn 1 phn t. Dy ban u c n phn t, vy tm tt tng thut ton l thc hin n-1
lt vic a phn t nh nht trong dy hin hnh v v tr ng u dy.
Phc tp thi gian: Trung bnh O(n2).
Phc tp d liu: Khng tn thm vng nh.
Cc bc tin hnh nh sau:
Bc 1: i=1
Bc 2: Tm phn t a[min] nh nht trong dy hin hnh t a[i] n a[n]
Bc 3: Hon v a[min] v a[i]
Bc 4: Nu i<=n-1 th i=i+1; Lp li bc 2
Ngc li: Dng. n-1 phn t nm ng v tr.
V d: Cho dy a = (12,2,8,5,1,6,4,15)
12 2 8 5 1 6 4 15
Bc 1: 1 2 8 5 12 6 4 15
Bc 2: 1 2 8 5 12 6 4 15
Bc 3: 1 2 4 5 12 6 8 15
Bc 4: 1 2 4 5 12 6 8 15
Bc 5: 1 2 4 5 6 12 8 15
Bc 6: 1 2 4 5 6 8 12 15
Bc 7: 1 2 4 5 6 8 12 15
2.Gii thut
Void SelectionSort(int a[], int n)
{
int min;
for(int i=0;i<n-1;i++)
{
min=i;
for(int j=i+1;j<n;j++)
if(a[j]<a[min]) min=j;
HoanVi(a[min],a[i]);
}
}
13
{
14
data = new int [ size ]; // create space for array
15
16
// fill array with random ints in range 10-99
17
for ( int i = 0; i < size; i++ )
18
data[ i ] = 10 + generator.nextInt( 90 );
19
} // end SelectionSort constructor
20
21
// sort array using selection sort
22
public void sort()
23
{
24
int smallest; // index of smallest element
25
26
// loop over data.length - 1 elements
27
for ( int i = 0 ; i < data.length - 1 ; i++ )
28
{
29
smallest = i; // first index of remaining array
30
31
// loop to find index of smallest element
32
for ( int index = i + 1 ; index < data.length; index++ )
33
if ( data[ index ] < data[ smallest ] )
34
smallest = index;
35
36
swap( i, smallest ); // swap smallest element into
position
37
printPass( i + 1, smallest ); // output pass of algorithm
38
} // end outer for
39
} // end method sort
40
41
// helper method to swap values in two elements
42
public void swap( int first, int second )
43
{
44
int temporary = data[ first ]; // store first in temporary
45
data[ first ] = data[ second ]; // replace first with second
46
data[ second ] = temporary; // put temporary in second
47
} // end method swap
48
49
// print a pass of the algorithm
50
public void printPass( int pass, int index )
51
{
52
System.out.print( String.format( "after pass %2d: ",
pass ) );
53
54
// output elements till selected item
55
for ( int i = 0 ; i < index; i++ )
56
System.out.print( data[ i ] + " " );
57
58
System.out.print( data[ index ] + "* " ); // indicate swap
59
60
// finish outputting array
61
for ( int i = index + 1; i < data.length; i++ )
62
System.out.print( data[ i ] + " " );
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
System.out.print( "\n
" );
Kt qu:
Unsorted array:
61 87 80 58 40 50 20 13 71 45
after pass 1: 13 87 80 58 40 50 20 61* 71 45
-after pass 2: 13 20 80 58 40 50 87* 61 71 45
-- -after pass 3: 13 20 40 58 80* 50 87 61 71 45
-- -- -after pass 4: 13 20 40 45 80 50 87 61 71 58*
-- -- -- -after pass 5: 13 20 40 45 50 80* 87 61 71 58
-- -- -- -- -after pass 6: 13 20 40 45 50 58 87 61 71 80*
-- -- -- -- -- -after pass 7: 13 20 40 45 50 58 61 87* 71 80
-- -- -- -- -- -- -after pass 8: 13 20 40 45 50 58 61 71 87* 80
-- -- -- -- -- -- -- -after pass 9: 13 20 40 45 50 58 61 71 80 87*
-- -- -- -- -- -- -- -- -Sorted array:
13 20 40 45 50 58 61 71 80 87
Bi 2:
Sp Xp Chn(Inserion Sort)
nhng ngi chi bi. Mun sp mt b bi theo trt t ngi chi bi rt ln lt t qun th 2,
so vi cc qun ng trc n chn vo v tr thch hp.
Phc tp thi gian: Trung bnh O(n2).
Phc tp d liu: Khng tn thm vng nh.
1.T tng
C s lp lun ca sp xp chn c th m t nh sau: Xt danh sch con gm k phn t u
a1,...,ak. Vi k = 1, danh sch gm mt phn t c sp. Gi s trong danh sch k-1 phn t
u a1,...,ak 1 c sp. sp xp phn t ak = x ta tm v tr thch hp ca n trong dy
a1,...,ak 1. V tr thch hp l ng trc phn t ln hn n v sau phn t nh hn hoc bng
n.
Cc phn t x
V tr thch hp
Cc phn t>x
Cc phn t cha sp
a1
ai + 1
ak + 1
...
ai 1
...
ak 1
...
an
V d
Cho danh sch
1
Lm tip theo vi a5 = 4 ta c
1
Lm tip theo vi a6 = 2 ta c
1
2.Gii thut
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
2
3
" );
3.2.Lp InsertionSortTest
1
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Kt qu
Unsorted array:
40 17 45 82 62 32 30 44 93 10
after pass 1: 17* 40 45 82 62 32 30 44 93 10
-- -after pass 2: 17 40 45* 82 62 32 30 44 93 10
-- -- -after pass 3: 17 40 45 82* 62 32 30 44 93 10
-- -- -- -after pass 4: 17 40 45 62* 82 32 30 44 93 10
-- -- -- -- -after pass 5: 17 32* 40 45 62 82 30 44 93 10
-- -- -- -- -- -after pass 6: 17 30* 32 40 45 62 82 44 93 10
-- -- -- -- -- -- -after pass 7: 17 30 32 40 44* 45 62 82 93 10
-- -- -- -- -- -- -- -after pass 8: 17 30 32 40 44 45 62 82 93* 10
-- -- -- -- -- -- -- -- -after pass 9: 10* 17 30 32 40 44 45 62 82 93
-- -- -- -- -- -- -- -- -- -Sorted array:
10 17 30 32 40 44 45 62 82 93
Sp Xp Trn(Merge Sort)
1.Trn
Gi s c hai danh sch c sp xp a[1..m] v b[1..n.]. Ta c th trn chng li thnh mt
danh sch mi c[1..m + n] c sp xp theo cch sau:
Khi mt trong hai danh sch l rng ta ly phn cn li ca danh sch kia cho
vo cui danh sch mi.
V d: Cho hai danh sch a = (1,3,7,9),b = (2,6), qu trnh ha nhp din ra nh sau:
Danh sch a
Danh sch b
So snh
1,3,7,9
2,6
1<2
3,7,9
2,6
2<3
1,2
3,7,9
3<6
1,2,3
7,9
6<7
1,2,3,6
7,9
Danh sch c
1,2,3,6,7,9
2.Trn ti ch
Gi s trong danh sch a[1..n] c 2 danh sch con k nhau a[k1..k2] v a[k2 + 1..k3] c sp.
Ta p dng cch trn tng t nh trn trn hai danh sch con vo mt danh sch tm T[k1..k3]
ri tr li cc gi tr ca danh sch tm T v danh sch A. Lm nh vy gi l trn ti ch.
3.Trn t di ln
Nu danh sch con ch gm hai phn t, mi na ca n gm mt phn t ng nhin c
sp. Do vic trn ti ch hai na danh sch ny cho danh sch con 2 phn t c sp.
Xut pht t u danh sch a ta trn a[1] vi a[2], a[3] vi a[4],... Khi mi danh sch con
gm hai phn t ca a c sp. Tip tc trn cc danh sch con k tip nhau gm 2 phn t
thnh cc danh sch con 4 phn t ... Mi ln trn s cc danh sch con cn trn gim i mt
na. Qu trnh dng li khi s danh sch con ch cn mt.
S DS con
Kt qu
2,3-5,6-1,4-7
2,3,5,6-1,4,7
1,2,3,4,5,6,7
2,7,6
3,4,5,1
Qu trnh chia
Qu trnh trn
2,7,6
2,6,7
7,6
6,7
Qu trnh chia
Qu trnh trn
3,4,5,1
1,3,4,5
3,4
5,1
3,4
1,5
4
2,6,7
1,3,4,5
1,2,3,4,5,6,7
5.Trn cc ng t nhin
Nh trong phn nh gi gii thut, mt trong nhng nhc im ln ca thut ton Trn trc
tip l khng tn dng nhng thng tin v c tnh ca dy cn sp xp. V d trng hp dy
c th t sn. Chnh v vy, trong thc t ngi ta t dng thut ton trn trc tip m ngi ta
dng phin bn ci tin ca n. Phin bn ny thng c bit vi tn gi thut ton trn t
nhin (Natural Merge sort).
5.1.Khi nim ng chy
kho st thut ton trn t nhin, trc tin ta cn nh ngha khi nim ng chy (run):
Mt ng chy ca dy s a l mt dy con khng gim ca cc i ca a.
Ngha l, ng chy r = (ai, ai+1, ..., aj) phi tha iu kin:
0 i j < n , vi n l s phn t ca dy a
ak ak+1 k, i k j
V d dy 12, 2, 8, 5, 1, 6, 4, 15 c th coi nh gm 5 ng chy (12); (2, 8);
(5); (1, 6); (4, 15).
5.2.Gii thut
Bc 1 : // Chun b
r = 0; // r dng m s dng chy
Bc 2 :
Tch dy a1, a2, ..., an thnh 2 dy b, c theo nguyn tc lun phin tng ng
chy:
Bc 2.1 :
Bc 2.2 :
Bc 3 :
Trn tng cp ng chy ca 2 dy b, c vo a.
Bc 4 :
Nu r <= 2 th tr li bc 2;
Ngc li: Dng;
5.3.u v nhc im
Thut ton trn t nhin khc thut ton trn trc tip ch thay v lun cng nhc phn
hoch theo dy con c chiu di k, vic phn hoch s theo n v l ng chy. ta ch
cn bit s ng chy ca a sau ln phn hoch cui cng l c th bit thi im dng
ca thut ton v dy c th t l dy chi c mt ng chy.
6.Gii thut
6.1.Trn
Procedure Merge(a,k1,k2,k3)
Var Int i,j,k
List T[k1..k3]
{
i=k1
j=k2
k=k1
while i<k2 and j<=k3
{
if a[i]<=a[j] then {
T[k]=a[i]
i=i+1
}
else {
T[k]=a[j]
j=j+1
}
k=k+1
}
if i>=k2 then
while k<=k3 {
T(k)=a[j]
j=j+1
k=k+1
}
if j>k3 then
while k<k2 {
T(k)=a[i]
i=i+1
k=k+1
}
For k=k1 to k3
a[k]=T[k]
6.2.Trn t di ln
Procedure MergeSortUp (a[1..n)
Var Int m,i
{
m=1
while m<n {
k=0
while k+m<=n {
merge(a,k+1,k+m+1,k+2m)
k=k+2m
}
}
m=2*m
}
6.3.Trn quy
Procedure MergeSort (a,k1,k2)
Var Int k3
{
if k1<k2 then {
k3=int((k1+k2)/2)
MergeSort(a,k1,k3)
MergeSort(a,k3+1,k2)
Merge(a,k1,k3+1,k2)
}
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
private void merge( int left, int middle1, int middle2, int right )
{
int leftIndex = left; // index into left subarray
int rightIndex = middle2; // index into right subarray
int combinedIndex = left; // index into temporary working array
int [] combined = new int [ data.length ]; // working array
// output two subarrays before merging
System.out.println( "merge:
" + subarray( left, middle1 ) );
System.out.println( "
" + subarray( middle2, right ) );
// merge arrays until reaching end of either
while ( leftIndex <= middle1 && rightIndex <= right )
{
// place smaller of two current elements into result
// and move to next space in arrays
if ( data[ leftIndex ] <= data[ rightIndex ] )
combined[ combinedIndex++ ] = data[ leftIndex++ ];
else
combined[ combinedIndex++ ] = data[ rightIndex++ ];
} // end while
// if left array is empty
if ( leftIndex == middle2 )
// copy in rest of right array
while ( rightIndex <= right )
combined[ combinedIndex++ ] = data[ rightIndex++ ];
else // right array is empty
// copy in rest of left array
while ( leftIndex <= middle1 )
combined[ combinedIndex++ ] = data[ leftIndex++ ];
// copy values back into original array
for ( int i = left; i <= right; i++ )
data[ i ] = combined[ i ];
// output merged array
System.out.println( "
System.out.println();
} // end method merge
109
110
111
112
113
114
7.2.Lp MergeShortTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Kt qu
" + sortArray );
Unsorted: 75 56 85 90 49 26 12 48 40 47
split:
75 56 85 90 49 26 12 48 40 47
75 56 85 90 49
26 12 48 40 47
split:
75 56 85 90 49
75 56 85
90 49
split:
75 56 85
75 56
85
split:
75 56
75
56
75
56
56 75
merge:
merge:
56 75
85
56 75 85
split:
90 49
90
49
merge:
90
merge:
49
49 90
56 75 85
49 90
49 56 75 85 90
split:
26 12 48 40 47
26 12 48
40 47
split:
26 12 48
26 12
48
split:
26 12
26
12
merge:
26
merge:
12 26
12
12 26
48
12 26 48
Cc bi lin quan:
Sp Xp Ni Bt(Bubble Sort)
Sp xp ni bt (bubble sort) l mt thut ton sp xp n gin, vi thao tc c bn l so snh
hai phn t k nhau, nu chng cha ng ng th t th i ch (swap). C th tin hnh t
trn xung (bn tri sang) hoc t di ln (bn phi sang). Sp xp ni bt cn c tn l sp
xp bng so snh trc tip. N s dng php so snh cc phn t nn l mt gii thut sp xp
kiu so snh.
Phc tp thi gian: Trung bnh O(n2).
Phc tp d liu: Khng tn thm vng nh.
1.T tng
1.1.Sp xp t trn xung
V d:
Qu trnh sp xp ni bt ca 5 phn t
Gi s dy cn sp xp c n phn t. Khi tin hnh t trn xung, ta so snh hai phn t u, nu
phn t ng trc ln hn phn t ng sau th i ch chng cho nhau. Tip tc lm nh vy
vi cp phn t th hai v th ba v tip tc cho n cui tp hp d liu, ngha l so snh (v
i ch nu cn) phn t th n-1 vi phn t th n. Sau bc ny phn t cui cng chnh l
phn t ln nht ca dy. Sau , quay li so snh (v i ch nu cn) hai phn t u cho n
khi gp phn t th n-2....
Ghi ch: Nu trong mt ln duyt, khng phi i ch bt c cp phn t no th danh sch
c sp xp xong.
1.2.Sp xp t di ln
2.Gii thut
2.1.Sp xp t trn xung
procedure bubble_sort1(list L, number n) //n=listsize
For number i from n downto 2
for number j from 1 to (n - 1)
if L[j] > L[j + 1] //nu chng khng ng th t
swap(L[j], L[j + 1]) //i ch chng cho nhau
endif
endfor
endfor
endprocedure
2.2.Sp xp t di ln
procedure bubble_sort2(list L, number n) //n=listsize
For' number i from 1 ' n-1
for number j from n-1 downto i
if L[j] > L[j + 1] //nu chng khng ng th t
swap(L[j], L[j + 1]) //i ch chng cho nhau
endif
endfor
endfor
endprocedure
2.3.Gim bt vng duyt
xong
i= i -1
endif
enddo
endprocedure
Ghi ch: Cng c th kng cn dng n bin i, khi mi ln kim tra u phi duyt t u
n cui dy.
4. Ci t bng Java
private static void bubbleSort(int[] unsortedArray, int length) {
int temp, counter, index;