95
Chương I : Chương I : Tìm Tìm kiếm kiếm & & Sắp Sắp xếp xếp

Chương I : Tìm kiếm & Sắp xếp

  • Upload
    nili

  • View
    83

  • Download
    0

Embed Size (px)

DESCRIPTION

Chương I : Tìm kiếm & Sắp xếp. Các giải thuật tìm kiếm nội. Tìm kiếm tuyến tính Tìm kiếm nhị phân. Tìm kiếm tuyến tính. Tìm kiếm tuyến tính. Bước 1: i = Vị trí đầu ; Bước 2: Nếu a [ i ] = x : Tìm thấy . Dừng , vị trí xuất hiện : i - PowerPoint PPT Presentation

Citation preview

Page 1: Chương I : Tìm kiếm  &  Sắp xếp

Chương I :Chương I :TìmTìm kiếmkiếm & & SắpSắp xếpxếp

Page 2: Chương I : Tìm kiếm  &  Sắp xế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

Page 3: Chương I : Tìm kiếm  &  Sắp xếp

TìmTìm kiếmkiếm tuyếntuyến tínhtính

Page 4: Chương I : Tìm kiếm  &  Sắp xếp

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.

Page 5: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 6: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 7: Chương I : Tìm kiếm  &  Sắp xếp

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

}

Page 8: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 9: Chương I : Tìm kiếm  &  Sắp xếp

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

}

Page 10: Chương I : Tìm kiếm  &  Sắp xếp

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))

Page 11: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 12: Chương I : Tìm kiếm  &  Sắp xếp

TìmTìm kiếmkiếm nhịnhị phânphân

Page 13: Chương I : Tìm kiếm  &  Sắp xếp

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 . .

Page 14: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 15: Chương I : Tìm kiếm  &  Sắp xếp

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..

Page 16: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 17: Chương I : Tìm kiếm  &  Sắp xếp

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

}

Page 18: Chương I : Tìm kiếm  &  Sắp xếp

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))

Page 19: Chương I : Tìm kiếm  &  Sắp xếp

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). ).

Page 20: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 21: Chương I : Tìm kiếm  &  Sắp xếp

CácCác giảigiải thuậtthuật SắpSắp xếpxếp nộinội

Page 22: Chương I : Tìm kiếm  &  Sắp xếp

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ử..

Page 23: Chương I : Tìm kiếm  &  Sắp xếp

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]

Page 24: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 25: Chương I : Tìm kiếm  &  Sắp xếp

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;

}}

Page 26: Chương I : Tìm kiếm  &  Sắp xếp

PhươngPhương pháppháp đổiđổi chỗchỗ trựctrực tiếptiếpInterchangeInterchange SortSort

Page 27: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 28: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 29: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 30: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 31: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 32: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 33: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 34: Chương I : Tìm kiếm  &  Sắp xếp

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]);

}

Page 35: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 36: Chương I : Tìm kiếm  &  Sắp xếp

PhươngPhương pháppháp chọnchọn trựctrực tiếptiếp SelectionSelection sortsort

Page 37: Chương I : Tìm kiếm  &  Sắp xếp

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ử.

Page 38: Chương I : Tìm kiếm  &  Sắp xếp

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í. .

Page 39: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 40: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 41: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 42: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 43: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 44: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 45: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 46: Chương I : Tìm kiếm  &  Sắp xếp

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]);}

}

Page 47: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 48: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 49: Chương I : Tìm kiếm  &  Sắp xếp

PhươngPhương pháppháp ChènChèn trựctrực tiếptiếp InsertionInsertion SortSort

Page 50: Chương I : Tìm kiếm  &  Sắp xếp

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).).

Page 51: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 52: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 53: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 54: Chương I : Tìm kiếm  &  Sắp xếp

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])

Page 55: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 56: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 57: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 58: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 59: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 60: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 61: Chương I : Tìm kiếm  &  Sắp xếp

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ụ

Page 62: Chương I : Tìm kiếm  &  Sắp xếp

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;

}

}

Page 63: Chương I : Tìm kiếm  &  Sắp xếp

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..

Page 64: Chương I : Tìm kiếm  &  Sắp xếp

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: :

Page 65: Chương I : Tìm kiếm  &  Sắp xếp

PhươngPhương pháppháp nổinổi bọtbọt BubbleBubble sortsort

Page 66: Chương I : Tìm kiếm  &  Sắp xếp

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. .

Page 67: Chương I : Tìm kiếm  &  Sắp xếp

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.

Page 68: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 69: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 70: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 71: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 72: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 73: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 74: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 75: Chương I : Tìm kiếm  &  Sắp xếp

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]);

}

Page 76: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 77: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 78: Chương I : Tìm kiếm  &  Sắp xếp

SắpSắp xếpxếp dựadựa trêntrên phânphân hoạchhoạchQuickQuick sortsort

Page 79: Chương I : Tìm kiếm  &  Sắp xếp

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..

Page 80: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 81: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 82: Chương I : Tìm kiếm  &  Sắp xếp

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]

Page 83: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 84: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 85: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 86: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 87: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 88: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 89: Chương I : Tìm kiếm  &  Sắp xếp

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ụ

Page 90: Chương I : Tìm kiếm  &  Sắp xếp

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);

}

Page 91: Chương I : Tìm kiếm  &  Sắp xếp

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..

Page 92: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 93: Chương I : Tìm kiếm  &  Sắp xếp

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)

Page 94: Chương I : Tìm kiếm  &  Sắp xếp

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

Page 95: Chương I : Tìm kiếm  &  Sắp xếp

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)