chương i : tìm kiếm & sắp xếp
Post on 13-Jan-2016
83 Views
Preview:
DESCRIPTION
TRANSCRIPT
Chương I :Chương I :TìmTìm kiếmkiếm & & SắpSắp xếpxếp
CácCác giảigiải thuậtthuật tìmtìm kiếmkiếm nộinội
TìmTìm kiếmkiếm tuyến tínhtuyến tính TìmTìm kiếmkiếm nhịnhị phânphân
TìmTìm kiếmkiếm tuyếntuyến tínhtính
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 4
TìmTìm kiếmkiếm tuyến tínhtuyến tính
BướcBước 1: 1: ii = = VịVị trítrí đầuđầu; ;
BướcBước 2: 2: NếuNếu aa[[ii] = ] = xx : : TìmTìm thấythấy. . DừngDừng, , vịvị trítrí xuấtxuất
hiệnhiện: : ii
BướcBước 3 : 3 : ii = = VịVị trítrí kếkế((ii);// );// xétxét tiếptiếp phầnphần tửtử kếkế trongtrong
mảngmảng
BướcBước 4: 4: NếuNếu ii > >VịVị trítrí cuốicuối: //: //HếtHết mảngmảng
KhôngKhông tìmtìm thấythấy. . DừngDừng..
NgượcNgược lạilại: : LặpLặp lạilại BướcBước 2. 2.
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 5
TìmTìm kiếmkiếm tuyến tínhtuyến tính(sequential search)(sequential search)
5Khóa tìm
7 13 5 21 6 2 8 150 1 2 3 4 5 6 7
Vị trí = 2
Tìm thành công
Số lần so sánh: 3
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 6
TìmTìm kiếmkiếm tuyến tính tuyến tính ((Khoâng tìm thaáyKhoâng tìm thaáy))
9
7 13 5 21 6 2 8 150 1 2 3 4 5 6 7
Không tìm thấy
Số lần so sánh: 8
Khóa tìm
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 7
TìmTìm kiếmkiếm tuyến tínhtuyến tính
int LinearSearch(int a[], int n, int x)
{
int i=0;
while(i<n && a[i]!=x) i++;
if (i<n) return i; // a[i] là phần tử có khoá xreturn -1; // tìm hết mảng nhưng không có x
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 8
TìmTìm kiếmkiếm tuyến tínhtuyến tính
CảiCải tiếntiến càicài đặtđặt: : dùngdùng phươngphương pháppháp “lính“lính canh”canh” ĐặtĐặt thêmthêm mộtmột phầnphần tửtử cócó giágiá trịtrị xx vàovào cuốicuối mảngmảng BảoBảo đảmđảm luônluôn tìmtìm thấythấy xx trongtrong mảngmảng SauSau đóđó dựadựa vàovào vịvị trítrí tìmtìm thấythấy đểđể kếtkết luậnluận. .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 9
TìmTìm kiếmkiếm tuyến tínhtuyến tính
int LinearSearch(int a[], int n, int x)
{
int i=0;
// mảng gồm N phần tử từ a[0]..a[N-1]a[n] = x; // thêm lính canh vào cuối dãy
while(a[i]!=x) i++;
if (i<n) return i; // a[i] là phần tử có khoá xreturn -1; // tìm hết mảng nhưng không có x
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 10
TìmTìm kiếmkiếm tuyến tínhtuyến tính
ĐánhĐánh giágiá giảigiải thuậtthuật::
VậyVậy giảigiải thuậtthuật tìmtìm tuầntuần tựtự cócó độđộ phứcphức tạptạp tínhtính toántoán cấpcấp nn: : TT((nn) = ) = OO((nn))
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 11
TìmTìm kiếmkiếm tuyến tínhtuyến tính
NhậnNhận xétxét:: GiảiGiải thuậtthuật tìmtìm tuyếntuyến tínhtính khôngkhông phụphụ thuộcthuộc vàovào thứthứ tựtự
củacủa cáccác phầnphần tửtử trongtrong danhdanh sáchsách, , dodo vậyvậy đâyđây làlà phươngphương pháppháp tổngtổng quátquát nhấtnhất đểđể tìmtìm kiếmkiếm trêntrên mộtmột danhdanh sáchsách bấtbất kỳkỳ..
MộtMột thuậtthuật toántoán cócó thểthể đượcđược càicài đặtđặt theotheo nhiềunhiều cáchcách kháckhác nhaunhau, , kỹkỹ thuậtthuật càicài đặtđặt ảnhảnh hưởnghưởng đếnđến tốctốc độđộ thựcthực hiệnhiện củacủa thuậtthuật toántoán. .
TìmTìm kiếmkiếm nhịnhị phânphân
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 13
TìmTìm kiếmkiếm nhịnhị phânphân
ĐốiĐối vớivới nhữngnhững dãydãy đãđã cócó thứthứ tựtự ( (giảgiả sửsử thứthứ tựtự tăngtăng ), ), cáccác phầnphần tửtử trongtrong dãydãy cócó quanquan hệhệ
a[i-1]a[i-1] a[i]a[i] a[i+1]a[i+1]
NếuNếu xx > > a[i]a[i] thìthì xx chỉchỉ cócó thểthể xuấtxuất hiệnhiện trongtrong đoạnđoạn [ [a[i+1]a[i+1] ,,a[N]a[N]] ]
củacủa dãydãy NếuNếu xx < < a[i]a[i] thìthì xx chỉchỉ cócó thểthể xuấtxuất hiệnhiện trongtrong đoạnđoạn [ [a[0]a[0] ,,a[i-1]a[i-1]] ]
củacủa dãydãy . .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 14
TìmTìm kiếmkiếm nhịnhị phânphân
ÝÝ tưởngtưởng củacủa giảigiải thuậtthuật làlà tạitại mỗimỗi bướcbước tiếntiến hànhhành soso sánhsánh xx vớivới phầnphần tửtử nằmnằm ở ở vịvị trítrí giữagiữa củacủa dãydãy tìmtìm kiếmkiếm hiệnhiện hànhhành, , dựadựa vàovào kếtkết quảquả soso sánhsánh nàynày đểđể quyếtquyết địnhđịnh giớigiới hạnhạn dãydãy tìmtìm kiếmkiếm ở ở bướcbước kếkế tiếptiếp làlà nửanửa trêntrên hayhay nửanửa dướidưới củacủa dãydãy tìmtìm kiếmkiếm hiệnhiện hànhhành
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 15
TìmTìm kiếmkiếm nhịnhị phânphânBướcBước 1: 1: leftleft = = VTĐVTĐ; ; rightright = = VTCVTC; ;
BướcBước 2: 2: TrongTrong khikhi leftleft rightright lặplặp: //: //đoạnđoạn tìmtìm kiếmkiếm chưachưa rỗngrỗng
BướcBước 21: 21: midmid = ( = (leftleft++rightright)/2; // )/2; // lấylấy mốcmốc soso sánhsánh
BướcBước 22: 22: NếuNếu aa[[midmid] = ] = xx: : // //TìmTìm thấythấy. .
DừngDừng, , vịvị trítrí xuấtxuất hiệnhiện: : midmid
BướcBước 23: 23: NếuNếu aa[[midmid] > ] > xx: : ////tìmtìm xx trongtrong dãydãy concon aleftaleft .. .. amidamid -1 -1
rightright = = midmid - 1; - 1;
NgượcNgược lạilại ////tìmtìm xx trongtrong dãydãy concon amidamid +1 +1 .. .. arightaright
leftleft = = midmid + 1; + 1;
////HếtHết lặplặp
BướcBước 3: 3: DừngDừng, , khôngkhông tìmtìm thấythấy..
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 16
TìmTìm kiếmkiếm nhịnhị phânphân10
Khóa tìm
2 5 8 10 12 13 15 18 21 240 1 2 3 4 5 6 7 8 9
left rightmid
Vi trí = 3
Tìm thấy
Số lần so sánh: 4
Khóa cần tìm nhỏ hơn hoặc bằngKhóa cần tìm lớn hơnKhóa cần tìm bằng
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 17
TìmTìm kiếmkiếm nhịnhị phânphânint BinarySearch(int a[],int n,int x ){
int left =0, right = n-1, mid;while (left <= right){
m = (left + right)/2;if (x == a[mid]) return m;//Tìm thấy x tại midif (x<a[mid]) r = mid -1;else l = mid +1;
}return -1; // trong dãy không có x
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 18
TìmTìm kiếmkiếm nhịnhị phânphân
ĐánhĐánh giágiá giảigiải thuậtthuật::
GiảiGiải thuậtthuật tìmtìm nhịnhị phânphân cócó độđộ phứcphức tạptạp tínhtính toántoán cấpcấp lognlogn: :
TT((nn) = ) = OO((loglog 2 2 nn))
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 19
TìmTìm kiếmkiếm nhịnhị phânphân
NhậnNhận xétxét:: GiảiGiải thuậtthuật tìmtìm nhịnhị phânphân dựadựa vàovào quanquan hệhệ giágiá trịtrị củacủa
cáccác phầnphần tửtử mảngmảng đểđể địnhđịnh hướnghướng trongtrong quáquá trìnhtrình tìmtìm kiếmkiếm, , dodo vậyvậy chỉchỉ ápáp dụngdụng đượcđược chocho nhữngnhững dãydãy đãđã cócó thứthứ tựtự. .
GiảiGiải thuậtthuật tìmtìm nhịnhị phânphân tiếttiết kiệmkiệm thờithời giangian hơnhơn rấtrất nhiềunhiều soso vớivới giảigiải thuậtthuật tìmtìm tuầntuần tựtự dodo
TnhịTnhị phânphân ((nn) = ) = OO((loglog 22 nn) < ) < TtuầnTtuần tựtự ((nn) = ) = OO((nn). ).
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 20
TìmTìm kiếmkiếm nhịnhị phânphân
NhậnNhận xétxét:: KhiKhi muốnmuốn ápáp dụngdụng giảigiải thuậtthuật tìmtìm nhịnhị phânphân cầncần phảiphải
xétxét đếnđến thờithời giangian sắpsắp xếpxếp dãydãy sốsố đểđể thỏathỏa điềuđiều kiệnkiện dãydãy sốsố cócó thứthứ tựtự. . ThờiThời giangian nàynày khôngkhông nhỏnhỏ, , vàvà khikhi dãydãy sốsố biếnbiến độngđộng cầncần phảiphải tiếntiến hànhhành sắpsắp xếpxếp lạilại => => khuyếtkhuyết điểmđiểm chínhchính chocho giảigiải thuậtthuật tìmtìm nhịnhị phânphân. .
CầnCần câncân nhắcnhắc nhunhu cầucầu thựcthực tếtế đểđể chọnchọn mộtmột trongtrong haihai giảigiải thuậtthuật tìmtìm kiếmkiếm trêntrên saosao chocho cócó lợilợi nhấtnhất. .
CácCác giảigiải thuậtthuật SắpSắp xếpxếp nộinội
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 22
ĐịnhĐịnh nghĩanghĩa bàibài toántoán sắpsắp xếpxếp
SắpSắp xếpxếp làlà quáquá trìnhtrình xửxử lýlý mộtmột danhdanh sáchsách cáccác phầnphần tửtử ((hoặchoặc cáccác mẫumẫu tintin) ) đểđể đặtđặt chúngchúng theotheo mộtmột thứthứ tựtự thỏathỏa mãnmãn mộtmột tiêutiêu chuẩnchuẩn nàonào đóđó dựadựa trêntrên nộinội dungdung thôngthông tintin lưulưu giữgiữ tạitại mỗimỗi phầnphần tửtử..
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 23
KháiKhái niệmniệm nghịchnghịch thếthế
KháiKhái niệmniệm nghịchnghịch thếthế: : XétXét mộtmột mảngmảng cáccác sốsố a[0]a[0], , a[1]a[1], , …… a[n-1]a[n-1].. NếuNếu cócó ii<<jj vàvà a[i]a[i] > > a[j]a[j], , thìthì tata gọigọi đóđó làlà mộtmột nghịchnghịch
thếthế.. MảngMảng chưachưa sắpsắp xếpxếp sẽsẽ cócó nghịchnghịch thếthế.. MảngMảng đãđã cócó thứthứ tựtự sẽsẽ khôngkhông chứachứa nghịchnghịch thếthế. .
a[0]a[0] a[1]a[1] …… a[na[n -1] -1]
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 24
CácCác phươngphương pháppháp sắpsắp xếpxếp thôngthông dụngdụng
Interchange sort Selection sort Insertion sort Bubble sort Quick sort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 25
Sử dụng hàm hoán vị
voidvoid SwapSwap( ( intint &a , &a , int int &b ) &b )
{{
int int temp = a; temp = a;
a = b;a = b;
b = temp;b = temp;
}}
PhươngPhương pháppháp đổiđổi chỗchỗ trựctrực tiếptiếpInterchangeInterchange SortSort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 27
InterchangeInterchange SortSort –– ÝÝ tưởngtưởng
NhậnNhận xétxét: : ĐểĐể sắpsắp xếpxếp mộtmột dãydãy sốsố, , tata cócó thểthể xétxét cáccác nghịchnghịch thếthế cócó trongtrong dãydãy vàvà làmlàm triệttriệt tiêutiêu dầndần chúngchúng điđi. .
ÝÝ tưởngtưởng chínhchính: : XuấtXuất phátphát từtừ đầuđầu dãydãy, , tìmtìm tấttất cảcả nghịchnghịch thếthế chứachứa phầnphần
tửtử nàynày, , triệttriệt tiêutiêu chúngchúng bằngbằng cáchcách đổiđổi chỗchỗ phầnphần tửtử nàynày vớivới phầnphần tửtử tươngtương ứngứng trongtrong cặpcặp nghịchnghịch thếthế. .
LặpLặp lạilại xửxử lýlý trêntrên vớivới cáccác phầnphần tửtử tiếptiếp theotheo trongtrong dãydãy
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 28
InterchangeInterchange SortSort –– ThuậtThuật toántoán////inputinput: : dãydãy ( (aa, n), n)////outputoutput: : dãydãy ( (aa, n) , n) đãđã đượcđược sắpsắp xếpxếp BướcBước 1 : 1 : ii = 1; = 1; // // bắtbắt đầuđầu từtừ đầuđầu dãydãy BướcBước 2 : 2 : jj = = ii+1; +1; ////tìmtìm cáccác cặpcặp phầnphần tửtử aa[[jj] < ] < aa[[ii], ],
jj>>ii BướcBước 3 : 3 : TrongTrong khikhi jj n n thựcthực hiệnhiện
NếuNếu aa[[jj]<]<aa[[ii]: ]: aa[[ii]]aa[[jj];]; jj = = jj+1;+1;
BướcBước 4 : 4 : ii = = ii+1; +1; NếuNếu ii < < nn: : LặpLặp lạilại BướcBước 2. 2. NgượcNgược lạilại: : DừngDừng. .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 29
InterchangeInterchange SortSort –– VíVí dụdụ
2 8 5 1 6 4 15
12
2 3 4 5 6 7 81
i
j
1
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 30
InterchangeInterchange SortSort –– VíVí dụdụ
12
8 5 2 6 4 15
1
2 3 4 5 6 7 81
i
j
2
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 31
InterchangeInterchange SortSort –– VíVí dụdụ
2 12
8 5 6 4 15
1
2 3 4 5 6 7 81
i
j
4
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 32
InterchangeInterchange SortSort –– VíVí dụdụ
2 4 12
8 6 5 15
1
2 3 4 5 6 7 81
i
j
5
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 33
InterchangeInterchange SortSort –– VíVí dụdụ
2 4 5 6 8 12
15
1
2 3 4 5 6 7 81
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 34
InterchangeInterchange SortSort - - CàiCài đặtđặt
void InterchangeSort(int a[], int n)
{
int i, j;
for (i = 0 ; i<n-1 ; i++)
for (j =i+1; j < n ; j++)
if(a[j]< a[i]) //nếu có nghịch thế thì đổi chỗ
Swap(a[i],a[j]);
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 35
InterchangeInterchange SortSort ĐánhĐánh giágiá giảigiải thuậtthuật SốSố lượnglượng cáccác phépphép soso sánhsánh xảyxảy rara khôngkhông phụphụ thuộcthuộc vàovào
tìnhtình trạngtrạng củacủa dãydãy sốsố banban đầuđầu SốSố lượnglượng phépphép hoánhoán vịvị thựcthực hiệnhiện tùytùy thuộcthuộc vàovào kếtkết quảquả
soso sánhsánh
PhươngPhương pháppháp chọnchọn trựctrực tiếptiếp SelectionSelection sortsort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 37
Selection sort – Ý tưởngSelection sort – Ý tưởng Nhận xét: Mảng có thứ tự thì a[i]=min(a[i], a[i+1], …, a[n-Nhận xét: Mảng có thứ tự thì a[i]=min(a[i], a[i+1], …, a[n-
1])1]) Ý tưởng: mô phỏng một trong những cách sắp xếp tự Ý tưởng: mô phỏng một trong những cách sắp xếp tự
nhiên nhất trong thực tế: nhiên nhất trong thực tế: Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa
phần tử này về vị trí đúng là đầu dãy hiện hànhphần tử này về vị trí đúng là đầu dãy hiện hành Xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban Xem dãy hiện hành chỉ còn n-1 phần tử của dãy ban
đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho dãy hiện hành... đến khi dãy hiện hành chỉ còn 1 phần dãy hiện hành... đến khi dãy hiện hành chỉ còn 1 phần tử. tử.
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 38
SelectionSelection sortsort –– ThuậtThuật toántoán////inputinput: : dãydãy ( (aa, n), n)////outputoutput: : dãydãy ( (aa, n) , n) đãđã đượcđược sắpsắp xếpxếp BướcBước 1 : 1 : ii = = VịVị trítrí đầuđầu;; BướcBước 2 : 2 : TìmTìm phầnphần tửtử aa[[minmin] ] nhỏnhỏ nhấtnhất trongtrong dãydãy hiệnhiện hànhhành
từtừ aa[[ii] ] đếnđến aa[n-1][n-1] BướcBước 3 : 3 : NếuNếu minmin ii: : HoánHoán vịvị aa[[minmin] ] vàvà aa[[ii]] BướcBước 4 : 4 : NếuNếu ii chưachưa làlà VịVị trítrí cuốicuối
ii = = VịVị trítrí kếkế((ii);); LặpLặp lạilại BướcBước 2 2
NgượcNgược lạilại: : DừngDừng. . //n //n phầnphần tửtử đãđã nằmnằm đúngđúng vịvị trítrí. .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 39
SelectionSelection sortsort –– VíVí dụdụ
2 8 5 1 6 4 15
12
i
min2 3 4 5 6 7 81
Find MinPos(1, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 40
SelectionSelection sortsort –– VíVí dụdụ
2 8 5 12
6 4 15
1
i
min2 3 4 5 6 7 81
Find MinPos(2, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 41
SelectionSelection sortsort –– VíVí dụdụ
2 8 5 12
6 4 15
1
i
min2 3 4 5 6 7 81
Find MinPos(3, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 42
SelectionSelection sortsort –– VíVí dụdụ
2 4 5 12
6 8 15
1
i
min2 3 4 5 6 7 81
Find MinPos(4, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 43
SelectionSelection sortsort –– VíVí dụdụ
2 4 5 12
6 8 15
1
i
min2 3 4 5 6 7 81
Find MinPos(5, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 44
SelectionSelection sortsort –– VíVí dụdụ
2 4 5 6 12
8 15
1
i
min2 3 4 5 6 7 81
Find MinPos(6, 8) Swap(a[i], a[min])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 45
SelectionSelection sortsort –– VíVí dụdụ
2 4 5 6 8 12
15
1
i
min2 3 4 5 6 7 81
Find MinPos(7, 8) Swap(a[i], a[min])
12
15
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 46
SelectionSelection sortsortvoid SelectionSort(int a[],int n ){
int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hànhfor (int i=0; i<n-1 ; i++){
min = i; for(int j = i+1; j < n ; j++)
if (a[j] < a[min]) min = j; // ghi nhận vị trí phần tử nhỏ nhấtif (min != i)
Swap(a[min], a[i]);}
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 47
SelectionSelection sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
ỞûỞû lượtlượt thứthứ ii, , cầncần (n- (n-ii) ) lầnlần soso sánhsánh đểđể xácxác địnhđịnh phầnphần tửtử nhỏnhỏ nhấtnhất hiệnhiện hànhhành. .
SốSố lượnglượng phépphép soso sánhsánh khôngkhông phụphụ thuộcthuộc vàovào tìnhtình trạngtrạng củacủa dãydãy sốsố banban đầuđầu..
TrongTrong mọimọi trườngtrường hợphợp, , sốsố lầnlần soso sánhsánh làlà::
21)n(n
i)(n1n
1i
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 48
SốSố lầnlần hoánhoán vịvị ( (mộtmột hoánhoán vịvị bằngbằng 3 3 phépphép gángán) ) phụphụ thuộcthuộc vàovào tìnhtình trạngtrạng banban đầuđầu củacủa dãydãy sốsố
SelectionSelection sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
PhươngPhương pháppháp ChènChèn trựctrực tiếptiếp InsertionInsertion SortSort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 50
InsertionInsertion SortSort –– ÝÝ tưởngtưởng NhậnNhận xét xét : :
MMọiọi dãydãy a[0]a[0] , , a[1]a[1] ,..., ,..., a[n-1]a[n-1] luônluôn cócó ii-1-1 phầnphần tửtử
đầuđầu tiêntiên a[0]a[0] , , a[1]a[1] ,... ,,... ,a[i-2]a[i-2] đãđã cócó thứthứ tựtự (2 ≤ (2 ≤ ii). ).
ÝÝ tưởngtưởng chínhchính: :
TTìmìm cáchcách chènchèn phầnphần tửtử aiai vàovào vịvị trítrí thíchthích hợphợp củacủa đoạnđoạn
đãđã đượcđược sắpsắp đểđể cócó dãydãy mớimới a[0]a[0] , , a[1]a[1] ,... ,,... ,a[i-1]a[i-1] trởtrở
nênnên cócó thứthứ tựtự. . VịVị trítrí nàynày chínhchính làlà pospos thỏathỏa : :
a[pos-1]a[pos-1] a[ia[i ]< ]< a[pos]a[pos] (1(1posposii).).
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 51
ChiChi tiếttiết hơnhơn:: DãyDãy banban đầuđầu a[0]a[0] , , a[1]a[1] ,..., ,..., a[n-1]a[n-1], , xemxem nhưnhư đãđã cócó
đoạnđoạn gồmgồm mộtmột phầnphần tửtử a[0]a[0] đãđã đượcđược sắpsắp. .
ThêmThêm a[1]a[1] vàovào đoạnđoạn a[0]a[0] sẽsẽ cócó đoạnđoạn a[0]a[0] a[1]a[1] đượcđược sắpsắp
ThêmThêm a[2]a[2] vàovào đoạnđoạn a[0]a[0] a[1]a[1] đểđể cócó đoạnđoạn a[0]a[0] a[1]a[1]
a[2]a[2] đượcđược sắpsắp
TiếpTiếp tụctục chocho đếnđến khikhi thêmthêm xongxong a[n-1]a[n-1] vàovào đoạnđoạn a[0]a[0]
a[1]a[1] ... ...a[n-1]a[n-1] sẽsẽ cócó dãydãy a[0]a[0] a[1]…a[1]…........ A[n-1]A[n-1] đượcđược sắpsắp..
Insertion Sort – Ý tưởngInsertion Sort – Ý tưởng
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 52
InsertionInsertion SortSort –– ThuậtThuật toántoán////inputinput: : dãydãy ( (aa, n), n)////outputoutput: : dãydãy ( (aa, n) , n) đãđã đượcđược sắpsắp xếpxếp BướcBước 1 1: : ii = 2; = 2; // // giảgiả sửsử cócó đoạnđoạn aa[0][0] đãđã đượcđược sắpsắp BướcBước 2 2: : xx = = aa[[ii]; ]; TìmTìm vịvị trítrí pospos thíchthích hợphợp trongtrong đoạnđoạn
aa[0][0] đếnđến aa[[ii] ] đểđể chènchèn xx vàovào
BướcBước 3 3: : DờiDời chỗchỗ cáccác phầnphần tửtử từtừ aa[[pospos] ] đếnđến aa[[ii-1] -1] sangsang phảiphải 1 1 vịvị trítrí đểđể dànhdành chổchổ chocho xx
BướcBước 4 4: : aa[[pospos] = ] = xx; ; // // cócó đoạnđoạn aa[0]..[0]..aa[[ii]] đãđã đượcđược sắpsắp BướcBước 5 5: : ii = = ii+1; +1; NếuNếu ii nn : : LặpLặp lạilại BướcBước 2. 2.
NgượcNgược lạilại : : DừngDừng. .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 53
InsertionInsertion SortSort –– VíVí dụdụ
2 8 5 1 6 4 15
12
2 3 4 5 6 7 81
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 54
2 8 5 1 6 4 15
12
i
x
2 3 4 5 6 7 81pos
2
InsertionInsertion SortSort –– VíVí dụdụChèn a[1] vào (a[0], a[1])
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 55
12
8 5 1 6 4 15
2
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[2] vào (a[0] … a[2])
8
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 56
8 12
5 1 6 4 15
2
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[3] vào (a[0] … a[3])
5
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 57
5 8 12
1 6 4 15
2
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[4] vào (a[0] … a[4])
1
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 58
2 5 8 12
6 4 15
1
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[5] vào (a[0]… a[5])
6
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 59
2 5 6 8 12
4 15
1
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[6] vào (a[0] … a[6])
4
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 60
2 4 5 6 8 12
15
1
i
x
2 3 4 5 6 7 81pos
InsertionInsertion SortSort –– VíVí dụdụChèn a[7] vào (a[0] … a[7])
15
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 61
2 4 5 6 8 12
15
1
pos2 3 4 5 6 7 81
InsertionInsertion SortSort –– VíVí dụdụ
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 62
InsertionInsertion SortSort –– CàiCài đặtđặtvoid InsertionSort(int a[], int n )
{ int pos, x;
for(int i=0 ; i<n ; i++) //đoạn a[0] đã sắp
{ x = a[i+1];pos= i;
while(pos>=0 && a[pos]>x)
{ a[pos+1] = a[pos];
pos--;
}a[pos]=x;
}
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 63
InsertionInsertion SortSort –– NhậnNhận xétxét
KhiKhi tìmtìm vịvị trítrí thíchthích hợphợp đểđể chènchèn aa[[ii] ] vàovào đoạnđoạn aa[0] [0] đếnđến aa[[ii-1], -1], dodo đoạnđoạn đãđã đượcđược sắpsắp cócó thểthể sửsử dụngdụng giảigiải thuậtthuật tìmtìm nhịnhị phânphân đểđể thựcthực hiệnhiện việcviệc tìmtìm vịvị trítrí pospos giảigiải thuậtthuật sắpsắp xếpxếp chènchèn nhịnhị phânphân BinaryBinary InsertionInsertion SortSort LưuLưu ýý: : ChènChèn nhịnhị phânphân chỉchỉ làmlàm giảmgiảm sốsố lầnlần soso sánhsánh, ,
khôngkhông làmlàm giảmgiảm sốsố lầnlần dờidời chỗchỗ.. NgoàiNgoài rara, , cócó thểthể cảicải tiếntiến giảigiải thuậtthuật chènchèn trựctrực tiếptiếp vớivới
phầnphần tửtử cầmcầm canhcanh đểđể giảmgiảm điềuđiều kiệnkiện kiểmkiểm tratra khikhi xácxác địnhđịnh vịvị trítrí pospos..
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 64
InsertionInsertion SortSort –– ĐánhĐánh giágiá giảigiải thuậtthuật
CácCác phépphép soso sánhsánh xảyxảy rara trongtrong mỗimỗi vòngvòng lặplặp tìmtìm vịvị trítrí thíchthích hợphợp pospos. . MỗiMỗi lầnlần xácxác địnhđịnh vịvị trítrí pospos đangđang xétxét khôngkhông thíchthích hợphợp dờidời chỗchỗ phầnphần tửtử aa[[pospos-1] -1] đếnđến vịvị trítrí pospos. .
GiảiGiải thuậtthuật thựcthực hiệnhiện tấttất cảcả NN-1 -1 vòngvòng lặplặp tìmtìm pospos, , dodo sốsố lượnglượng phépphép soso sánhsánh vàvà dờidời chỗchỗ nàynày phụphụ thuộcthuộc vàovào tìnhtình trạngtrạng củacủa dãydãy sốsố banban đầuđầu, , nênnên chỉchỉ cócó thểthể ướcước lượclược trongtrong từngtừng trườngtrường hợphợp nhưnhư sausau: :
PhươngPhương pháppháp nổinổi bọtbọt BubbleBubble sortsort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 66
BubbleBubble sortsort –– ÝÝ tưởngtưởng
ÝÝ tưởngtưởng chínhchính: : XuấtXuất phátphát từtừ cuốicuối ( (đầuđầu) ) dãydãy, , đổiđổi chỗchỗ cáccác cặpcặp phầnphần tửtử
kếkế cậncận đểđể đưađưa phầnphần tửtử nhỏnhỏ ( (lớnlớn) ) hơnhơn trongtrong cặpcặp phầnphần tửtử đóđó vềvề vịvị trítrí đúngđúng đầuđầu ( (cuốicuối) ) dãydãy hiệnhiện hànhhành, , sausau đóđó sẽsẽ khôngkhông xétxét đếnđến nónó ởở bướcbước tiếptiếp theotheo, ,
ỞỞ lầnlần xửxử lýlý thứthứ ii cócó vịvị trítrí đầuđầu dãydãy làlà ii LặpLặp lạilại xửxử lýlý trêntrên chocho đếnđến khikhi khôngkhông còncòn cặpcặp phầnphần tửtử
nàonào đểđể xétxét. .
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 67
BubbleBubble sortsort –– ThuậtThuật toántoán
////inputinput: : dãydãy ( (aa, n), n)////outputoutput: : dãydãy ( (aa, n) , n) đãđã đượcđược sắpsắp xếpxếp BướcBước 1 : 1 : ii = = VịVị trítrí đầuđầu; ; BướcBước 2 : 2 : jj = = VịVị trítrí cuốicuối;;////DuyệtDuyệt từtừ cuốicuối dãydãy ngượcngược vềvề vịvị
trítrí ii TrongTrong khikhi ( (jj > > ii) ) thựcthực hiệnhiện::
NếuNếu aa[[jj]<]<aa[[jj-1]: -1]: aa[[jj]]aa[[jj-1];-1];////xétxét cặpcặp phầnphần tửtử kếkế cậncận
jj = = VịVị trítrí trướctrước((jj);); BướcBước 3 : 3 : ii = = VịVị trítrí kếkế((ii);); // // lầnlần xửxử lýlý kếkế tiếptiếp
NếuNếu ii = = VịVị trítrí cuốicuối: : DừngDừng. . // // HếtHết dãydãy.. NgượcNgược lạilại : : LặpLặp lạilại BướcBước 2. 2.
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 68
BubbleBubble SortSort –– VíVí dụdụ
2 8 5 1 6 4 15
12
2 3 4 5 6 7 81
i
j
1
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 69
BubbleBubble SortSort –– VíVí dụdụ
12
2 8 5 4 6 15
1
2 3 4 5 6 7 81
i
j
2
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 70
BubbleBubble SortSort –– VíVí dụdụ
2 12
4 8 5 6 15
1
2 3 4 5 6 7 81
i
j
4
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 71
BubbleBubble SortSort –– VíVí dụdụ
2 4 12
8 5 6 15
1
2 3 4 5 6 7 81
i
j
5
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 72
BubbleBubble SortSort –– VíVí dụdụ
2 4 5 12
8 6 15
1
2 3 4 5 6 7 81
i
j
6
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 73
BubbleBubble SortSort –– VíVí dụdụ
2 4 5 6 12
8 15
1
2 3 4 5 6 7 81
i
j
8
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 74
BubbleBubble SortSort –– VíVí dụdụ
2 4 5 6 8 12
15
1
2 3 4 5 6 7 81
i
j
15
12
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 75
BubbleBubble sortsort - - CàiCài đặtđặt
void BubbleSort(int a[], int n)
{
int i, j;
for (i = 0 ; i<n-1 ; i++)
for (j =n-1; j>i ; j --)
if(a[j]< a[j-1]) Swap(a[j], a[j-1]);
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 76
BubbleBubble sortsort - - ĐánhĐánh giágiá giảigiải thuậtthuật
SốSố lượnglượng cáccác phépphép soso sánhsánh xảyxảy rara khôngkhông phụphụ thuộcthuộc vàovào tìnhtình trạngtrạng củacủa dãydãy sốsố banban đầuđầu
SốSố lượnglượng phépphép hoánhoán vịvị thựcthực hiệnhiện tùytùy thuộcthuộc vàovào kếtkết quảquả soso sánhsánh
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 77
KhuyếtKhuyết điểmđiểm: : KhôngKhông nhậnnhận diệndiện đượcđược tìnhtình trạngtrạng dãydãy đãđã cócó thứthứ tựtự hayhay
cócó thứthứ tựtự từngtừng phầnphần. . CácCác phầnphần tửtử nhỏnhỏ đượcđược đưađưa vềvề vịvị trítrí đúngđúng rấtrất nhanhnhanh, ,
trongtrong khikhi cáccác phầnphần tửtử lớnlớn lạilại đượcđược đưađưa vềvề vịvị trítrí đúngđúng rấtrất chậmchậm..
BubbleBubble sortsort - - ĐánhĐánh giágiá giảigiải thuậtthuật
SắpSắp xếpxếp dựadựa trêntrên phânphân hoạchhoạchQuickQuick sortsort
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 79
QuickQuick sortsort –– ÝÝ tưởngtưởng MộtMột vàivài hạnhạn chếchế củacủa thuậtthuật toántoán ĐổiĐổi chỗchỗ trựctrực tiếptiếp::
MỗiMỗi lầnlần đổiđổi chổchổ chỉchỉ thaythay đổiđổi 1 1 cặpcặp phầnphần tửtử trongtrong nghịchnghịch thếthế; ; cáccác trườngtrường hợphợp nhưnhư: : ii < < jj < < kk vàvà aiai > > ajaj > > akak (*)(*) chỉchỉ cầncần thựcthực hiệnhiện 1 1 lầnlần đổiđổi chổchổ ( (aiai, , akak): ): thuậtthuật toántoán khôngkhông làmlàm đượcđược..
ĐộĐộ phứcphức tạptạp củacủa thuậtthuật toántoán OO((NN22) ) khikhi NN đủđủ lớnlớn thuậtthuật toántoán sẽsẽ rấtrất chậmchậm
ÝÝ tưởngtưởng: : phânphân chiachia dãydãy thànhthành cáccác đoạnđoạn concon tậntận dụngdụng đượcđược cáccác phépphép đổiđổi chỗchỗ dạngdạng (*) (*) vàvà làmlàm giảmgiảm độđộ dàidài dãydãy khikhi sắpsắp xếpxếp cảicải thiệnthiện đángđáng kểkể độđộ phứcphức tạptạp củacủa thuậtthuật toántoán..
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 80
QuickQuick sortsort –– ÝÝ tưởngtưởng GiảiGiải thuậtthuật QuickSortQuickSort sắpsắp xếpxếp dãydãy a[0]a[0], , a[1]a[1] ..., ..., a[n-1]a[n-1] dựadựa
trêntrên việcviệc phânphân hoạchhoạch dãydãy banban đầuđầu thànhthành 3 3 phầnphần : : PhầnPhần 1: 1: GồmGồm cáccác phầnphần tửtử cócó giágiá trịtrị khôngkhông lớnlớn hơnhơn xx PhầnPhần 2: 2: GồmGồm cáccác phầnphần tửtử cócó giágiá trịtrị bằngbằng xx PhầnPhần 3: 3: GồmGồm cáccác phầnphần tửtử cócó giágiá trịtrị khôngkhông bébé hơnhơn xx
vớivới xx làlà giágiá trịtrị củacủa mộtmột phầnphần tửtử tùytùy ýý trongtrong dãydãy banban đầuđầu. . SauSau khikhi thựcthực hiệnhiện phânphân hoạchhoạch, , dãydãy banban đầuđầu đượcđược phânphân thànhthành 3 3
đoạnđoạn:: 1. 1. a[k]a[k] ≤ ≤ xx , , vớivới kk = 1 .. = 1 .. jj 2. 2. a[ka[k ] = ] = xx , , vớivới kk = = jj+1 .. +1 .. ii-1-1 3. 3. a[ka[k ] ] xx , , vớivới kk = = ii..n-1..n-1
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 81
ĐoạnĐoạn thứthứ 2 2 đãđã cócó thứthứ tựtự. . NếuNếu cáccác đoạnđoạn 1 1 vàvà 3 3 chỉchỉ cócó 1 1 phầnphần tửtử thìthì chúngchúng cũngcũng
đãđã cócó thứthứ tựtự, , khikhi đóđó dãydãy concon banban đầuđầu đãđã đượcđược sắpsắp. . NgượcNgược lạilại, , nếunếu cáccác đoạnđoạn 1 1 vàvà 3 3 cócó nhiềunhiều hơnhơn 1 1 phầnphần tửtử
thìthì dãydãy concon banban đầuđầu chỉchỉ cócó thứthứ tựtự khikhi cáccác đoạnđoạn 1, 3 1, 3 đượcđược sắpsắp. .
ĐểĐể sắpsắp xếpxếp cáccác đoạnđoạn 1 1 vàvà 3, 3, tata lầnlần lượtlượt tiếntiến hànhhành việcviệc phânphân hoạchhoạch từngtừng dãydãy concon theotheo cùngcùng phươngphương pháppháp phânphân hoạchhoạch dãydãy banban đầuđầu vừavừa trìnhtrình bàybày ……
QuickQuick sortsort –– ÝÝ tưởngtưởng
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 82
QuickQuick sortsort –– GiảiGiải thuậtthuật////inputinput: : dãydãy concon ( (aa, , leftleft, , rightright))
////outputoutput: : dãydãy concon ( (aa, , leftleft, , rightright) ) đượcđược sắpsắp tăngtăng dầndần BướcBước 1: 1: NếuNếu leftleft = = rightright ////dãydãy cócó ítít hơnhơn 2 2 phầnphần tửtử
KếtKết thúcthúc;; ////dãydãy đãđã đượcđược sắpsắp xếpxếp BướcBước 2: 2: PhânPhân hoạchhoạch dãydãy a[left]a[left] …… a[right]a[right] thànhthành cáccác đoạnđoạn: :
a[left]a[left].. a.. a[j][j],, a[j+1]a[j+1].. .. a[i-1]a[i-1],, a[i]a[i].. a[.. a[right]right]
////ĐoạnĐoạn 1 1 xx - - ĐoạnĐoạn 2: 2: a[j+1]a[j+1].. a.. a[i-1][i-1] = = xx - - ĐoạnĐoạn 3: 3: a[i]a[i].. .. a[righta[right] ] xx
BướcBước 3: 3: SắpSắp xếpxếp đoạnđoạn 1 1: : a[left]a[left].. a.. a[j][j] BướcBước 4: 4: SắpSắp xếpxếp đoạnđoạn 3 3: : a[i]a[i].. a.. a[right][right]
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 83
QuickQuick sortsort –– PhânPhân hoạchhoạch dãydãy////inputinput: : dãydãy concon a[left]a[left], , ……, , a[right]a[right]////outputoutput: : dãydãy concon chiachia thànhthành 3 3 đoạnđoạn: : đoạnđoạn 1 ≤ 1 ≤ đoạnđoạn 2 ≤ 2 ≤ đoạnđoạn 3 3 BướcBước 1: 1: ChọnChọn tùytùy ýý mộtmột phầnphần tửtử aa[[pp] ] trongtrong dãydãy concon làlà giágiá trịtrị mốcmốc: :
xx = = aa[[pp];]; BướcBước 2: 2: DuyệtDuyệt từtừ 2 2 đầuđầu dãydãy đểđể phátphát hiệnhiện vàvà hiệuhiệu chỉnhchỉnh cặpcặp phầnphần tửtử
aa[[ii], ], aa[[jj] ] vivi phạmphạm điềuđiều kiệnkiện BướcBước 21: 21: ii = = leftleft; ; jj = = rightright; ; BướcBước 22: 22: TrongTrong khikhi ( (aa[[ii]<]<xx) ) ii++;++; BướcBước 23: 23: TrongTrong khikhi ( (aa[[jj]>]>xx) ) jj--;--; BướcBước 24: 24: NếuNếu ii<= <= jj // // aa[[ii] ] xx aa[[jj] ] màmà aa[[jj] ] đứngđứng sausau aa[[ii]]
HoánHoán vịvị ( (aa[[ii],],aa[[jj]);]); ii++; ++; jj--;--; BướcBước 25: 25: NếuNếu ii < < jj:: LặpLặp lạilại BướcBước 22.// 22.//chưachưa xétxét hếthết mảngmảng////HếtHết duyệtduyệt
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 84
QuickQuick sortsort –– VíVí dụdụ
2 8 5 1 6 4 15
12
2 3 4 5 6 7 81
left right
5X
STOP
Khoâng nhoû hôn x
i j
STOP
Khoâng lôùn hôn x
Phân hoạch dãy
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 85
QuickQuick sortsort –– VíVí dụdụ
2 8 5 1 6 12
15
4
2 3 4 5 6 7 81
left right
5X
STOP
Không nhỏ hơn x
i j
STOP
Không lớn hơn x
Phân hoạch dãy
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 86
QuickQuick sortsort –– VíVí dụdụ
2 1 5 8 6 12
15
4
2 3 4 5 6 7 81
left right
ij
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 87
6X
QuickQuick sortsort –– VíVí dụdụ
2 4 5 8 6 12
15
1
2 3 4 5 6 7 81
left right
i j
STOP
Không nhỏ hơn x
STOP
Không lớn hơn x
Sắp xếp đoạn 3
Phân hoạch dãy
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 88
QuickQuick sortsort –– VíVí dụdụ
2 4 5 6 8 12
15
1
2 3 4 5 6 7 81
left right
ij
Sắp xếp đoạn 3
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 89
2 4 5 6 8 12
15
1
2 3 4 5 6 7 81
ShellShell sortsort –– VíVí dụdụ
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 90
QuickQuick sortsort –– CàiCài đặtđặtvoid QuickSort(int a[], int left, int right){
int i, j, x;if (left right) return;
x = a[(left+right)/2]; // chọn phần tử giữa làm giá trị mốc i = left; j = right; do{ while(a[i] < x) i++; while(a[j] > x) j--; if(i <= j) {
Swap(a[i], a[j]); i++ ; j--;
}} while(i < j) ;if(left<j) QuickSort(a, left, j);if(i<right) QuickSort(a, i, right);
}
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 91
QuickQuick sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật NhậnNhận xétxét:: VềVề nguyênnguyên tắctắc, , cócó thểthể chọnchọn giágiá trịtrị mốcmốc xx làlà mộtmột phầnphần tửtử tùytùy
ýý trongtrong dãydãy, , nhưngnhưng đểđể đơnđơn giảngiản, , phầnphần tửtử cócó vịvị trítrí giữagiữa thườngthường đượcđược chọnchọn, , khikhi đóđó pp = ( = (ll + +rr)/ 2.)/ 2.
GiáGiá trịtrị mốcmốc xx đượcđược chọnchọn sẽsẽ cócó táctác độngđộng đếnđến hiệuhiệu quảquả thựcthực hiệnhiện thuậtthuật toántoán vìvì nónó quyếtquyết địnhđịnh sốsố lầnlần phânphân hoạchhoạch. . SốSố lầnlần phânphân hoạchhoạch sẽsẽ ítít nhấtnhất nếunếu tata chọnchọn đượcđược xx làlà phầnphần
tửtử trungtrung vịvị ( (medianmedian), ), nhiềunhiều nhấtnhất nếunếu xx làlà cựccực trịtrị củacủa dãydãy.. TuyTuy nhiênnhiên dodo chichi phíphí xácxác địnhđịnh phầnphần tửtử medianmedian quáquá caocao
nênnên trongtrong thựcthực tếtế ngườingười tata khôngkhông chọnchọn phầnphần tửtử nàynày màmà chọnchọn phầnphần tửtử nằmnằm chínhchính giữagiữa dãydãy làmlàm mốcmốc vớivới hyhy vọngvọng nónó cócó thểthể gầngần vớivới giágiá trịtrị medianmedian..
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 92
HiệuHiệu quảquả phụphụ thuộcthuộc vàovào việcviệc chọnchọn giágiá trịtrị mốcmốc:: TrườngTrường hợphợp tốttốt nhấtnhất: : mỗimỗi lầnlần phânphân hoạchhoạch đềuđều chọnchọn
phầnphần tửtử medianmedian làmlàm mốcmốc, , khikhi đóđó dãydãy đượcđược phânphân chiachia thànhthành 2 2 phầnphần bằngbằng nhaunhau vàvà cầncần loglog22((nn) ) lầnlần phânphân hoạchhoạch
thìthì sắpsắp xếpxếp xongxong. . NếuNếu mỗimỗi lầnlần phânphân hoạchhoạch chọnchọn phầnphần tửtử cócó giágiá trịtrị cựccực
đạiđại ( (hayhay cựccực tiểutiểu) ) làlà mốcmốc dãydãy sẽsẽ bịbị phânphân chiachia thànhthành 2 2 phầnphần khôngkhông đềuđều: : mộtmột phầnphần chỉchỉ cócó 1 1 phầnphần tửtử, , phầnphần còncòn lạilại gồmgồm ( (nn-1) -1) phầnphần tửtử, , dodo vậyvậy cầncần phânphân hoạchhoạch nn lầnlần mớimới sắpsắp xếpxếp xongxong..
QuickQuick sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 93
QuickQuick sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
ĐộĐộ phứcphức tạptạp thuậtthuật toántoán::
Tröôøng Tröôøng hôïphôïp
Ñoä phöùc taïpÑoä phöùc taïp
Toát Toát nhaátnhaát
O(NlogN)O(NlogN)
Trung Trung bìnhbình
O(NlogN)O(NlogN)
Xaáu Xaáu nhaátnhaát
O(NO(N2)2)
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 94
HiệuHiệu quảquả phụphụ thuộcthuộc vàovào việcviệc chọnchọn giágiá trịtrị mốcmốc:: TrườngTrường hợphợp tốttốt nhấtnhất: : mỗimỗi lầnlần phânphân hoạchhoạch đềuđều chọnchọn
phầnphần tửtử medianmedian làmlàm mốcmốc, , khikhi đóđó dãydãy đượcđược phânphân chiachia thànhthành 2 2 phầnphần bằngbằng nhaunhau vàvà cầncần loglog22((nn) ) lầnlần phânphân hoạchhoạch
thìthì sắpsắp xếpxếp xongxong. . NếuNếu mỗimỗi lầnlần phânphân hoạchhoạch chọnchọn phầnphần tửtử cócó giágiá trịtrị cựccực
đạiđại ( (hayhay cựccực tiểutiểu) ) làlà mốcmốc dãydãy sẽsẽ bịbị phânphân chiachia thànhthành 2 2 phầnphần khôngkhông đềuđều: : mộtmột phầnphần chỉchỉ cócó 1 1 phầnphần tửtử, , phầnphần còncòn lạilại gồmgồm ( (nn-1) -1) phầnphần tửtử, , dodo vậyvậy cầncần phânphân hoạchhoạch nn lầnlần mớimới sắpsắp xếpxếp xongxong..
QuickQuick sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
Caáu truùc Döõ lieäu - Tìm kieám vaø Saép xeáp 95
QuickQuick sortsort –– ĐánhĐánh giágiá giảigiải thuậtthuật
ĐộĐộ phứcphức tạptạp thuậtthuật toántoán::
Tröôøng Tröôøng hôïphôïp
Ñoä phöùc taïpÑoä phöùc taïp
Toát Toát nhaátnhaát
O(NlogN)O(NlogN)
Trung Trung bìnhbình
O(NlogN)O(NlogN)
Xaáu Xaáu nhaátnhaát
O(NO(N2)2)
top related