1. Trang chủ
  2. » Giáo Dục - Đào Tạo

sap xep

186 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 186
Dung lượng 2,4 MB

Nội dung

• Cứ như vậy, các bức thư sẽ được trao đến tay người nhận một cách có hệ thống mà công việc sắp xếp thư không quá nặng cách có hệ thống mà công việc sắp xếp thư không quá nặng.. Ngược lạ[r]

(1)

Chương 2

Các gii thut tìm kiếm

Các gii thut tìm kiếm

và sp th t

(2)

2.1 Gii thiu chung

• Trong hTrong hầầu hu hếết ht hệệ llưưu tru trữữ, qu, quảản lý dn lý dữữ liliệệu, thaou, thao tác tìm kiếm thường thực để khai thác thơng tin

• Do hệ thống thông tin thường phải lưu trữ khối lượng dg ữ liệu đáng kg ể, nên việc xây dy ựng cácg giải thuật cho phép tìm kiếm nhanh có ý nghĩa lớn

(3)

2.1 Gii thiu chung

• Có nhiều giải thuật tìm kiếm xếp

• Có nhiều giải thuật tìm kiếm xếp

• Mức độ hiệu giải thuật phụ thuộc vào tính chất cấu trúc liệu cụ thể mà tác động tính chất cấu trúc liệu cụ thể mà tác động

đến

• Dữ liệu lưu trữ chủ yếu nhớ

• Dữ liệu lưu trữ chủ yếu nhớ nhớ phụ, đặc điểm khác thiết bị

(4)

2.2 Các gii thut tìm kiếm Bài tốn:

Tìm vị trí xuất phần tử có giá trị x danh sách đặc a

Input:

- Một dãy số nguyên a0, a1, ,an-1 i t [ 1]

int a[n-1];

- Khoá cần tìm x

int x; int x;

Output:

(5)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Lần lượt so sánh x với phần tử mảng bắt đầu

Ý tưởng:

(6)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Thuật tốn:

Bước 1: Cho biến i giá trị khởi đầu

Bước 2: So sánh x với a[i] x = a[i] sang bước Thuật tốn:

Bước 2: So sánh x với a[i], x a[i] sang bước 3, không sang bước

B 3 Kết l ậ “Tì thấ ” Kết thú Bước 3: Kết luận “Tìm thấy” Kết thúc Bước 4: Tăng giá trị i thêm đơn vị

(7)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính

Ví dụ:

2.2.1 Tìm kiếm tuyến tính

Cho dãy số a

12 15

Ví dụ:

(8)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính

• i =

2.2.1 Tìm kiếm tuyến tính

i

(9)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính

Cài đặt:

2.2.1 Tìm kiếm tuyến tính

Cài đặt:

int LinearSearch(int a[],int n,int x) {

int i=0;

int i=0; while(i<n) {

if (a[i]==x) return i; // a[i] phần tử có khóa x i++;

} }

(10)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Nhận xét: Nhận xét:

Thuật tốn có điểm hạn chế: phải kiểm tra lần vòng lặp

lần vòng lặp

Khắc phục:

Sử dụng kỹ thuật phần tử “lính canh”, nghĩa ta cho thêm phần tử a[n]=x, vậy, bảo đảm

(11)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Cài đặt: Cài đặt:

int LinearSearch(int a[],int n,int x) {

int i=0;

int i=0; a[n]=x;

while(x!=a[i]) i++;

if (i==n)

returnetu -1; ; // tìm h// tìm hếết mt mảảng nhng nhưưng khơng có xng khơng có x

else

return i; // tìm thấy x vị trí i }

(12)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Đánh giá: Đánh giá:

(13)

2.2 Các gii thut tìm kiếm

2 Tìm kiếm tuyến tính 2.2.1 Tìm kiếm tuyến tính

Nhận xét: Nhận xét:

• Giải thuật tìm tuyến tính khơng phụ thuộc vào thứ

tự ủ hầ tử t d h h d ậ đâ tự phần tử danh sách, phương pháp tổng quát để tìm kiếm danh sách

danh sách

• Đối với mảng có thứ tự thuật tốn khơng tối

ưu khơng tận dụng tính chất có thứ tự

(14)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Đối với dãy có thứ tự (giả sử thứ tự

) hầ d h

tăng), phần tử dãy có quan hệ ai -1 ≤ ai ≤ ai+1

Nếu x > ai x xuất

đoạn [a[ i+1i+1 ,an-1n 1] c] dãy.y

Nếu x < ai x xuất

đoạn [a0 ai 1] dãy

(15)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Ý tưởng:

(16)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Thuật tốn: Thuật tốn:

Bước 1: Khởi tạo left = 0, right = n -

Bước 2: Xác định phần tử giữa: mid = (left + right)/2

Bước 3: So sánh x với a[mid] Nếu x = a[mid] sang

Bước 3: So sánh x với a[mid] Nếu x a[mid] sang bước 4, khơng sang bước

ế l hấ ế h

Bước 4: Kết luận “Tìm thấy” Kết thúc

(17)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Thuật tốn: Thuật tốn:

Bước 6: Giới hạn khơng gian tìm kiếm: right = mid -1, sang bước

Bước 7: Giới hạn khơng gian tìm kiếm: left = mid + 1,

Bước 7: Giới hạn không gian tìm kiếm: left mid 1, sang bước

ế l f i h b kh h l i

(18)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Ví dụ: Ví dụ:

Cho dãy số a gồm phần tử:

1 12 15

(19)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

(20)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

(21)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Cài đặt:

i t Bi S h(i t [] i t i t )

int BinarySearch(int a[],int n,int x) {

int left = 0, right = n-1, mid;

do do

{

mid = (left + right)/2;

if (x == a[mid])

( [ ])

return mid; //Tìm thấy x mid

if (x<a[mid])

right = mid -1;

l else

left = mid +1;

} while (left <= right);

return -1; // dãy khơng có x

(22)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Đánh giá: Đánh giá:

(23)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Nhận xét: Nhận xét:

• Giải thuật dựa vào thứ tự phần tử

ả để đị h hướ iệ ắ ế ê khô thể mảng để định hướng việc xếp nên áp dụng cho trường hợp, áp dụng cho dãy có thứ tự

những dãy có thứ tự

• Giải thuật tìm nhị phân tiết kiệm thời gian nhiều so với giải thuật tìm tuyến tính

nhiều so với giải thuật tìm tuyến tính

(24)

2.2 Các gii thut tìm kiếm

2 2 Tìm kiếm nh phân 2.2.2 Tìm kiếm nh phân

Nhận xét: Nhận xét:

• Khi muốn áp dụng giải thuật tìm nhị phân cần phải ét đế thời i ắ ế dã ố để thỏ điề kiệ

xét đến thời gian xếp dãy số để thỏa điều kiện dãy số có thứ tự Thời gian không nhỏ, dãy số biến động cần phải tiến hành xếp lại ⇒ dãy số biến động cần phải tiến hành xếp lại ⇒ khuyết điểm cho giải thuật tìm nhị phân

(25)

2.3 Các gii thut sp xếp ni

2 1 Định nghĩa toán sp xếp 2.3.1. Định nghĩa toán sp xếp

Sắp xếp trình xử lý danh sách phần tử

Sắp xếp trình xử lý danh sách phần tử

(hoặc mẫu tin) để đặt chúng theo thứ tự thỏa mãn mộột tiêu chuẩn dựựa nộội dung thơngg g tin lưu giữ phần tử

Lưu ý: Thứ tự đề cập thứ tự tổng

Lưu ý: Thứ tự đề cập thứ tự tổng quát

Ví dụ: Hãy định nghĩa thứ tự để dãy số sau

Ví dụ: Hãy định nghĩa thứ tự để dãy số sau dãy tăng theo thứ tự

1 3 5 7 22 20 10 6

(26)

2.3 Các gii thut sp xếp ni

2 1 Định nghĩa toán sp xếp 2.3.1. Định nghĩa toán sp xếp

Xét mảng số a0 a1 a Khái niệm “NGHỊCH THẾ”

Xét mảng số a0, a1, … an

Nếu có i<j ai > aj, ta gọi nghịch Mả h ắ ế ẽ ó hị h hế

Mảng chưa xếp có nghịch

(27)

2.3 Các gii thut sp xếp ni

2 Các phương pháp sp xếp thông dng

l i Phứ t h

2.3.2 Các phương pháp sp xếp thơng dng

• Selection sort

• Insertion sort

• Interchange sort

• Shell sort

• Heap sort Q i k

Phức tạp Hiệu cao

• Interchange sort

• Bubble sort

• Shaker sort

• Quick sort

• Merge sort

• Radix sort

Shaker sort

• Binary Insertion sort

• Radix sort

• …

Lớp thuật tốn Đơn giản,

Chi phí cao

(28)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Ý tưởng:

- Chọn phần tử nhỏ đặt vào vị trí

Ch hầ tử hỏ hất t ố hầ tử ò - Chọn phần tử nhỏ số n - phần tử cịn lại đặt vào vị trí thứ

- Lặp lại trình mảng phần tử

(29)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Thuật toán:

Bước 1: Khởi tạo i =

Bước 2: Khởi đầu = i, j = i +

Bước 3: Nếu a[j] < a[min] = j, khơng sang bước

sang bước

(30)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Thuật toán:

ế ế

Bước 5: Nếu j < n quay lại bước 3, khơng sang bước

Bước 6: Đổi chỗ a[min] a [i], tăng i lên đơn vị

Bước 7: Nếu i < n quay lại bước khơng

(31)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(0, 7) Swap(ai, amin)

min

1 2 3 4 5 6 7

0

2 8 5 1 6 4 15

12

(32)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(2, 7) Swap(ai, amin)

2 8 12 6 4 1

1

min

1 2 3 4 5 6 7

0

2 8 5 12 6 4 15

1

(33)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(3, 7) Swap(ai, amin)

2 4 5 12 6 8 15

1

min

1 2 3 4 5 6 7

0

2 4 5 12 6 8 15

1

(34)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(4, 7) Swap(ai, amin)

min

1 2 3 4 5 6 7

0

2 4 5 12 6 8 15

1

(35)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(5, 7) Swap(ai, amin)

min

1 2 3 4 5 6 7

0

2 4 5 6 12 8 15

1

(36)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Find MinPos(6, 7) Swap(ai, amin)

min

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

1 12 15

(37)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

void SelectionSort(int a[],int n) {

Cài đặt:

{

int min; // số phần tử nhỏ dãy hành

for (int i=0; i<n-1 ; i++) {

{

min = i;

for(int j = i+1; j < n ; j++)

if (a[j] < a[min])

if (a[j] < a[min])

min = j; // ghi nhận vị trí phần tử nhỏ nhất

if (min != i)

swap(a[min] a[i]);

(38)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Đánh giá:

Số lần hoán vị (một hoán vị phép gán) phụ

h ì h b đầ d ố

(39)

2.3 Các gii thut sp xếp ni

2 3 Phương pháp chn trc tiếp

2.3.3 Phương pháp chn trc tiếp – Selection sort

Đánh giá:

Ở lượt thứ i, cần (n-i) lần so sánh để xác định phần tử

h hấ hi hà h nhỏ hành

Số lượng phép so sánh không phụ thuộc vào tình trạng dãy số ban đầu

của dãy số ban đầu

(40)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Ý

Ý tưởng:

-Tại bước thứ i phần tử từ a[0] đến a[i-1] có thứ

tự tăng dần

- Đầu tiên ta bắt đầu với i = (a[0] không c( [ ] g ần sắp)p)

- Tìm vị trí thích hợp để chèn a[1] vào đoạn a[0]…a[1]

Kế tiế tì ị t í thí h h để hè [2] đ

- Kế tiếp, tìm vị trí thích hợp để chèn a[2] vào đoạn a[0]…a[2]

(41)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Th á

Thuật toán:

- Bước 1: Khởi tạo i =1

- Bước 2: pos = i -1, x = a[i]

- Bước 3: Nếu x < a[pos] sang b[p ] g ước khơng sangg g bước

B 4 Dời [ ] hải [ +1] [ ] iả

(42)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Th á

Thuật toán:

- Bước 5: Nếu pos ≥ quay lại bước 3, không sang bước

- Bước 6: Gán a[pos+1] = x, t[p ] , ăng i thêm 1g đơn vịị

(43)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Ví dụ:

1 2 3 4 5 6 7

0

2 8 5 1 6 4 15

(44)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a1 into (0, 1)

2 8 5 1 6 4 15

12

1 2 3 4 5 6 7

0 pos

2 2 8 5 1 6 4 15

122

i

(45)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a2 into (0, 2)

1 2 3 4 5 6 7

0

pos 8

12 8 5 1 6 4 15

2 8

i

(46)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a3 into (0, 3)

8 12 5 1 6 4 15

2

1 2 3 4 5 6 7

0 pos

8 12 5 1 6 4 15

2 5

i

(47)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a4 into (0, 4)

5 8 12 1 6 4 15

2

1 2 3 4 5 6 7

0

pos

1 5 8 12 1 6 4 15

21

i

(48)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a5 into (0, 5)

2 5 8 12 6 4 15

1

1 2 3 4 5 6 7

0 pos

6

2 5 8 12 6 4 15

1 6

i

(49)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a6 into (0, 6)

1 2 3 4 5 6 7

0 pos

2 5 6 8 12 4 15

1 4

i

(50)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Insert a7 into (0, 7)

1 2 3 4 5 6 7

0 pos

2 4 5 6 8 12 15

1 15

i

(51)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

pos

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

(52)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Cài đặ Cài đặt:

void InsertionSort(int a[],int n) {

{

int pos;

int x ; //lưu trữ a[i] tránh bị ghi đè dời chỗ phần tử.

for(int i=1;i<n;i++) //đoạn a[0] đã sắp

for(int i=1;i<n;i++) //đoạn a[0] sắp {

x = a[i];

for(pos=i;(pos>0)&&(a[pos-1]>x);pos ) a[pos] = a[pos-1];

(53)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Nhậ é

Nhận xét:

- Khi tìm vị trí thích hợp để chèn a[i] vào đoạn a[0] đến a[i-1] đoạn Ỵ sử dụng giải thuật tìm 1], đoạn Ỵ sử dụng giải thuật tìm nhị phân để thực việc tìm vị trí pos Ỵ giải thuật xếp chèn nhị phân Binary Insertion Sort

Lưu ý: Chèn nhị phân chỉ làm giảm số lần so sánh, không làm giảm số lần dời chỗ.

(54)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Cài đặt Binary Insertion Sort: Cài đặt Binary Insertion Sort:

void BInsertionSort(int a[],int n)

{ int l,r,m,i;

i t //l t iá t [i] t h bị hi đè dời hỗ á hầ tử int x; //lưu trữ giá trị a[i] tránh bị ghi đè dời chỗ phần tử.

for(int i=1;i<n;i++)

{ x = a[i]; l = 0; r = i-1;

while(l<=r) // tìm vị trí chèn x

while(l<=r) // tìm vị trí chèn x

{ m = (l+r)/2; // tìm vị trí thích hợp m

if(x < a[m]) r = m-1;

else l = m+1; }

for(int j = i ; j >l ; j )

(55)

2.3 Các gii thut sp xếp ni

2 4 Phương pháp chèn trc tiếp

2.3.4 Phương pháp chèn trc tiếp – Insertion sort

Đánh giá: Đánh giá:

- Các phép so sánh xảy vịng lặp tìm vị trí thích hợp pos Mỗi lần xác định vị trí pos xét khơng thích hợp Î dời

ầ ế

chỗ phần tử a[pos-1] đến vị trí pos

(56)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

Nhn xét:

Để xếp dãy số, ta xét nghịch có Ý tưởng:

ể ếp ộ dãy số, a có ể é g ịc ế có dãy làm triệt tiêu dần chúng

Ý tưởng:

- Xuất phát từ đầu dãy, tìm tất nghịch chứa phần tử triệt tiêu chúng cách đổi chỗ phần tử tử này, triệt tiêu chúng cách đổi chỗ phần tử với phần tử tương ứng cặp nghịch

(57)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

Th á

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

Thuật toán:

- Bước 1: Khởi tạo i = // bắt đầu từ đầu dãy

- Bước 2: j = i+1; //tìm cặp phần tử a[j] < a[i], j>i

- Bước 3: Trong j < n thg j ựực hiệện

• Nếu a[j]<a[i]: a[i]↔a[j];

• j = j+1; - Bước 4: i = i+1;

• Nếu i < n-1: Lặp lại Bước

(58)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

Ví dụ:

j

2 8 5 1 6 4 15

12

1 2 3 4 5 6 7

0 j

1 2 8 5 1 6 4 15

12

i

1

(59)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

j

12 8 5 2 6 4 15

1

1 2 3 4 5 6 7

0 j

2

12 8 5 2 6 4 15

1

i

2

(60)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

j

2 12 8 5 6 4 15

1

1 2 3 4 5 6 7

0 j

4

2 12 8 5 6 4 15

1

i

4

(61)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

j

2 4 12 8 6 5 15

1

1 2 3 4 5 6 7

0 j

5

2 4 12 8 6 5 15

1

i

5

(62)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

2 4 5 6 8 12 15

1

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

(63)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

Cài đặ

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

Cài đặt:

void InterchangeSort(int a[], int n) {

{

int i, j;

for (i = ; i<n-1 ; i++)

for (j =i+1; j < n ; j++)

for (j i+1; j < n ; j++)

if(a[j]< a[i]) //nếu có nghịch đổi chỗ

(64)

2.3 Các gii thut sp xếp ni

2 Phương pháp đổi ch trc tiếp

Đánh giá:

2.3.5 Phương pháp đổi ch trc tiếp – Interchange sort

Đánh giá:

- Số lượng phép so sánh xảy khơng phụ thuộc vào tình trạng dãy số ban đầu

trạng dãy số ban đầu

- Số lượng phép hoán vị thực tùy thuộc vào kết so sánh

(65)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

Ý tưởng: Ý tưởng:

- Đưa dần phần tử có khóa (giá trị) nhỏ phía trước

trước

- Xuất phát từ cuối (đầu) dãy, đổi chỗ cặp phần tử kế

cận để đưa phần tử nhỏ (lớn) cặp phần tử cận để đưa phần tử nhỏ (lớn) cặp phần tử vị trí đầu (cuối) dãy hành, sau khơng xét đến bước

- Ở lần xử lý thứ i có vị trí đầu dãy i

- Lặp lại xử lý khơng cịn cặp phần tử

(66)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Th á

2.3.6 Phương pháp ni bt – Bubble sort

Thuật toán:

- Bước 1: Khởi tạo i =0

- Bước 2: j = n-1; //Duyệt từ cuối dãy ngược về vị trí i

- Bước 3: Trong j > i thg j ựực hiệện

• Nếu a[j]<a[j-1]: a[j]↔a[j-1]; //xét cặp phần tử kế cận

• j = j-1;

- Bước 4: i = i+1; // lần xử lý kế tiếp

• Nếu i = n-1: Dừng // Hết dãy

(67)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

Ví dụ:

j

2 8 5 1 6 4 15

12

1 2 3 4 5 6 7

0 j

1

(68)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

12 2 8 5 4 6 15

1

1 2 3 4 5 6 7

0 j

2

(69)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

2 12 4 8 5 6 15

1

1 2 3 4 5 6 7

0 j

4

(70)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

2 4 12 8 5 6 15

1

1 2 3 4 5 6 7

0 j

5

(71)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

2 4 5 12 8 6 15

1

1 2 3 4 5 6 7

0 j

6

(72)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

2 4 5 6 12 8 15

1

1 2 3 4 5 6 7

0 j

8

(73)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort 2.3.6 Phương pháp ni bt – Bubble sort

j

2 4 5 6 8 12 15

1

1 2 3 4 5 6 7

0 j

15 12

(74)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Cài đặ

2.3.6 Phương pháp ni bt – Bubble sort

Cài đặt:

void BubbleSort(int a[], int n) {

int i, j;

for (i = ; i<n-1 ; i++)

for (j =n-1; j>i ; j )

if(a[j]< a[j-1])

swap(a[j], a[j-1]);

(75)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Đánh giá:

2.3.6 Phương pháp ni bt – Bubble sort

Đánh giá:

- Số lượng phép so sánh xảy khơng phụ thuộc vào tình trạng dãy số ban đầu

trạng dãy số ban đầu

- Số lượng phép hoán vị thực tùy thuộc vào kết so sánh

(76)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Đánh giá:

2.3.6 Phương pháp ni bt – Bubble sort

Đánh giá:

Khuyết điểm:

- Không nhận diện tình trạng dãy có thứ tự hay - Khơng nhận diện tình trạng dãy có thứ tự hay có thứ tự phần

(77)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Cải tiến:

2.3.6 Phương pháp ni bt – Bubble sort

Cải tiến:

Gii thut ShakerSort:

- DDựựa nguyên ta nguyên tắắcc đổđổi chi chỗỗ trtrựực tic tiếếpp

- Tìm cách khắc phục nhược điểm BubleSort

ƒ Trong lần xếp, duyệt mảng theo lượt từ phía khác :

o Lượt đi: đẩy phần tử nhỏ đầu mảng L t ề đẩ hầ tử lớ ề ối ả

o Lượt về: đẩy phần tử lớn cuối mảng

ƒ Ghi nhận lại đoạn xếp nhằm tiết kiệm phép so sánh thừa

(78)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Cải tiến:

2.3.6 Phương pháp ni bt – Bubble sort

Cải tiến:

Gii thut ShakerSort:

- Bước 1: l = 0; r = n-1; //từ l đến r là đoạn cần được xếp

k = n-1; // ghi nhận lại vị trí k xảy hoán vị sau cùng để làm cơ sở thu hẹp đoạn l đến r

Bước 2:

- Bước 2:

Bước 2a: j = r ; // đẩy phần tử nhỏ về đầu mảng

Trong (j > l) :

Nếu a[j]<a[j-1]: a[j] ↔ a[j-1]; k = j; //lưu lại nơi xảy hoán vị j = j 1;

(79)

2.3 Các gii thut sp xếp ni

2 Phương pháp ni bt Bubble sort

Cải tiến:

2.3.6 Phương pháp ni bt – Bubble sort

Cải tiến:

Gii thut ShakerSort:

- Bước 2:

Bước 2b: j = l ; // đẩy phần tử lớn về cuối mảng

Trong (j < r):

Nếu a[j]>a[j+1]: a[j] ↔ a[j+1]; Nếu a[j]>a[j+1]: a[j] ↔ a[j+1]; k = j;//lưu lại nơi xảy hoán vị j = j+1;

r = k; //loại bớt phần tử có thứ tự ở cuối dãy

(80)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

hi hầ h hấ b i h

2.3.7 Sp xếp –Heap sort

• Khi tìm phần tử nhỏ bước i, phương pháp xếp chọn trực tiếp không tận dụng

đ hơ i đ ó đ d

được thơng tin có phép so sánh bước i-1

• Giải thuật Heap Sort khắc phục nhược điểm cách chọn cấu trúc

liệu cho phép tích lũy thơng tin so sánh giá trị phần tử trình

ế

(81)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

• Xét dãy số :

2.3.7 Sp xếp –Heap sort

Xét dãy số :

(82)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

• Phần tử mức i phần tử lớn cặp phần

2.3.7 Sp xếp –Heap sort

Phần tử mức i phần tử lớn cặp phần tử tương ứng mức i+1

⇒ pphần tử mức (nút g( gốc cây) phy) p ần tử

lớn dãy

• Nếu loạại bỏ php ần tử ggốc khỏi (nghy ( g ĩa đưa phần tử lớn vị trí), việc cập nhật xảy nhánh liên quan đến phần tử

mới loại bỏ, cịn nhánh khác bảo tồn, nghĩa bước sử dụng lại kết so sánh

ở bước

(83)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

• Loại bỏ khỏi vào chỗ trống

2.3.7 Sp xếp –Heap sort

(84)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

T há h t ủ â ũ đ bả t

2.3.7 Sp xếp –Heap sort

• Tồn nhánh trái cũ bảo toàn

(85)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

• Tiến hành nhiều lần việc loại bỏ phần tử gốc

2.3.7 Sp xếp –Heap sort

Tiến hành nhiều lần việc loại bỏ phần tử gốc tất phần tử -∞,

đó xếp phần tử theo thứ tự loại bỏ có dãy xếp

• Để cài đặt thuật tốn hiệu quả, cần phải tổ chức

ấ ể

cấu trúc lưu trữ liệu có khả thể quan hệ phần tử với n nhớ thay hư t í d

2n-1 ví dụ

(86)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

Định nghĩa heap:

2.3.7 Sp xếp –Heap sort

• Heap dãy phần tử aleft, aleft+1, , aright thoả quan hệ:

– ai ≥ a2i

– ai ≥ a2i+1

– với ∀i ∈ [left, right]

• Khi (ai , a2i), (ai ,a2i+1) gọi cặp phần tử liên đới

• Heap định nghĩa dùng

ờ h ắ ế ă dầ ắ ế iả dầ

(87)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

Ví dụ dãy heap:

2.3.7 Sp xếp –Heap sort

Ví dụ dãy heap:

1 2 3 4 5 6 7

0 1 2 3 4 5 6 7

0

12 8 5 1 4 6 2

(88)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

a Các phần tử

2.3.7 Sp xếp –Heap sort

a1 Các phần tử

của dãy biểu diễn theo

a2 a3 mối quanhệ liên đới

a4 a5 a6 a7

(89)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

2.3.7 Sp xếp –Heap sort

Một số tính chất Heap:

Tính chất 1: Nếu aleft, aleft+1, …, aright heap

ắ ố ầ ầ

thì cắt bỏ số phần tử hai đầu heap, dãy lại heap

Tí h hấ 2 Nế ột h

Tính chất 2: Nếu a0, a1, …, an-1 heap phần tử a0 (đầu heap) ln phần tử lớn heap

trong heap

Tính chất 3: Mọi dãy aleft, aleft+1, , aright thỏa: 2left > right heap

(90)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

Ví d các tính cht ca heap

2.3.7 Sp xếp –Heap sort

Ví d các tính cht ca heap

1 2 3 4 5 6 7

0

12 8 5 1 6 4 2

15

12 8 5 1 6 4

(91)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

Sắ ế dã tă dầ i i đ

2.3.7 Sp xếp –Heap sort

• Sắp xếp dãy tăng dần qua giai đoạn:

GiaiGiai đđooạạn 1:n 1: DDựựa vào tính cha vào tính chấất ct củủa heapa heap đểđể hihiệệuu chỉnh dãy ban đầu thành heap

Giai đoạn 2: Dựa vào tính chất heap

để xếp heap có sau giai đoạn thành dãy

(92)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

Vấ đề Đổi hỗ ột ố hầ tử t ê dã

2.3.7 Sp xếp –Heap sort

Vn đề: Đổi chỗ số phần tử dãy a1,…, an để dãy trở thành heap

Ý tưởng: theo tính chất 3, dãy an/2+1, an/2+2, ,an đương nhiên heap Lần lượt thêm vào phía trước dãy phần tử an/2, an/2-1, …, a1; bước thêm vào cần hiệu chỉnh vị trí phần tử theo mối quan hệ liên đới ta nhận

(93)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1

//input: dãy (a, n)

//output: dãy (a n) heap

Giai đoạn 1

//output: dãy (a, n) heap

Bước 1: left = n/2; //Thêm phần tử aleft, , a1 vào heap

heap

Bước 2: Trong left >

//Lưu ý: đoạn a a heap //Lưu ý: đoạn aleft+1, …, an heap

Bước 21: Hiệu chỉnh đoạn aleft, …, an thành heap

(94)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1 Giai đoạn 1

1 2 3 4 5 6 7

0

2 8 5 1 6 4 15

(95)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1 Giai đoạn 1

15

1 2 3 4 5 6 7

0 curr joint joint

5 15

2 8 5 1 6 4

12

l ft

5

(96)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1 Giai đoạn 1

1 2 3 4 5 6 7

0 curr joint joint joint

2 8 15 1 6 4 5

12

l ft

8

(97)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1 Giai đoạn 1

1 2 3 4 5 6 7

0 joint joint curr

15 8 5 1 6 4 2

12

(98)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 1 Giai đoạn 1

1 2 3 4 5 6 7

0

12 8 5 1 6 4 2

(99)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

Vn đề: Sắp xếp heap a0, …, an-1 thành dãy tăng dần

//Đặt: right = n-1dãy a1, …, aright là heap. //Đặt: right n 1 Î dãy a1, …, aright là heap.

Ý tưởng:

– Theo tính chất 2: a sẽTheo tính chất 2: a0 phần tửlà phần tử lớn vịlớn nhất, vị trítrí đúngđúng a0 phải right - cuối dãy

→ Đổi chỗ (a0, arightg ) Ỵ thêm phần tử vị trí

– Theo tính chất 3: dãy a1, …, aright-1 heap Giả i ht thê dã hiệ hỉ h l i

(100)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

//input: dãy (a, n) heap

//output: dãy (a, n) tăng dần

B i h //Bắ đầ h hiệ ối dã

• Bước 1: right = n-1; //Bắt đầu thực từ cuối dãy

• Bước 2: Trong right >

//Đ hầ tử lớ hất ( ) ề ị t í i ht //Đưa phần tử lớn (a0)về vị trí right

– Bước 21: Hoánvị (a0 , aright);

//Loại bỏ phần tử lớn khỏi heap //Loại bỏ phần tử lớn khỏi heap – Bước 22: right := right -1;

– Bước 23: Hiệu chỉnh đoạn a0, a1, …, arightg thành heap

(101)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạạn 2

12 8 5 1 6 4 2

15

1 2 3 4 5 6 7

0

right

(102)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

joint joint

curr

12 8 5 1 6 4 15

2

1 2 3 4 5 6 7

0 joint joint curr

right

(103)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

5 8 2 1 6 4 15

12

1 2 3 4 5 6 7

0

right

(104)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

joint joint

curr joint

5 8 2 1 6 12 15

4

1 2 3 4 5 6 7

0 joint joint

curr joint

right

(105)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

5 6 2 1 4 12 15

8

1 2 3 4 5 6 7

0

right

(106)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Giai đoạn 2

5 6 2 1 8 12 15

4

1 2 3 4 5 6 7

0

2 4 6 8 12 1

1 2 4 5 6 8 12 15

(107)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Hiệu chỉnh Heap

Vn đề: dãy aleft+1, aleft+2, …, aright heap, cần hiệệu chu c ỉnh lạạ đểi để aaleftleft, …, a, …, arightright heapà eap

Ý tưởng: aleft+1, aleft+2, …, aright heap nên tất

các phần tử thỏa điều kiện liên đới Ỵ

các phần tử thỏa điều kiện liên đới Ỵ

vấn đề trở thành: kiểm tra quan hệ liên đới aleft đổi chỗ aleftleft với liên đới thích hợợp cp quan hệ liên đới bị vi phạm; sau hiệu chỉnh vi phạm điều kiện liên đới lan truyền đến vị

(108)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Hiệu chỉnh Heap

1 2 3 4 5 6 7

0 curr joint joint joint

2

2 8 15 1 6 4 5

(109)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Hiệu chỉnh Heap

Nhn xét: Q trình hiệu chỉnh có nhiều bước

đổi chỗ trung gian không cần thiết

đổi chỗ trung gian khơng cần thiết

• Trong ví dụ: đổi chỗ (2, 15), sau đổi chỗ

tiế (2 5) ị t í ối ù ủ ị t í tiếp (2, 5): vị trí cuối 8, vị trí tạm thời, khơng cần thiết

ể ỗ

• Có thể thực việc dời chỗ hàng loạt, sau

(110)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

// là h

2.3.7 Sp xếp –Heap sort

Hiệu chỉnh Heap

//input: dãy aleft+1, aleft+2, …, aright là heap //output: dãy aleft, aleft+1, …, aright là heap

• Bước 1:

– curr = left; x = acurr; //Bắt đầu kiểm tra từ vị trí left

– joint = 2*curr + 1; //Liên đới thứ nhất curr

• Bước 2: Trong (jointg (j ≤ right)g ) //Còn liên đới để xét

– Bước 21: Nếu (joint < right) && (ajoint+1 > ajoint)

joint = joint + 1; //joint: vị trí liên đới lớn nhất

– BBướước 22: Nc 22: Nếếu au ajointjoint ≤≤ xx //Th//Thỏỏaa đđiiềều kiu kiệện liênn liên đớđớii

Chuyển đến Bước

– Bước 23: acurr = ajoint; curr = joint; joint = 2*curr + 1;

(111)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Hiệu chỉnh Heap Hiệu chỉnh Heap

2

2 8 15 1 6 4 5

1 2 3 4 5 6 7

0 curr joint ??? joint

2

2 8 15 1 6 4 5

l ft right

(112)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Cài đặt

• Để cài đặt giải thuật Heapsort cần xây dựng thủ

tục:

– Thủ tục hiệu chỉnh dãy aleft, aleft+1, …, aright thành heap:

void Shift(int a[],int left,int right)

h h ể đổi d h h h

– Thủ tục chuyển đổi dãy a0, a2, …, an-1 thành heap:

void CreateHeap(int a[], int n )

Thủ tục xếp dãy a a a tăng dần:

– Thủ tục xếp dãy a0, a2, …, an-1 tăng dần:

(113)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort

void Shift (int a[], int left, int right) {

2.3.7 Sp xếp –Heap sort

Cài đặt

{

int x, curr, joint;

curr = left; joint =2*curr+1 ; // ajoint: phần tử liên đới x = a[curr];

x = a[curr];

while (joint <= right) {

if (joint < right) // có đủ 2 phần tử liên đới

if (joint < right) // có đủ phần tử liên đới

if (a[joint] < a[joint+1]) joint = joint+1;

if (a[joint]<x) j break; //thoả quan hệ liên đớiq a[curr] = a[joint];

curr = joint; // xét tiếp khả hiệu chỉnh lan truyền joint = 2*curr+1;

(114)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Cài đặt

void CreateHeap(int a[], int n) {

int left;

//left: vị trí phần tử cần ghép thêm

for (left = (n-1)/2; left >= 0; left )

for (left = (n-1)/2; left >= 0; left )

(115)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Cài đặt

void HeapSort (int a[], int n) {

intt right;g t;

CreateHeap(a, n); //sắp xếp dãy a thành heap

right = n-1; // right vị trí cho phần tử lớn nhất

hil ( i ht > 0)

while (right > 0) {

swap(a[0],a[right]); right ;

Shift(a,0,right); }

(116)

2.3 Các gii thut sp xếp ni

2 Sp xếp Heap sort 2.3.7 Sp xếp –Heap sort

Đánh giá

• Việc đánh giá cách xác giải thuật Heapsort phức tạp Tuy nhiên, đánh giá cách tương đối dựa vào số nhận xét:

một cách tương đối dựa vào số nhận xét:

– Khi xem xét heap dạng quan hệ liên đới Ỉ phần tử heap tạo thành nhịp y ị phân cóp độộ cao h≈logg22n

– Ở bước hiệu chỉnh, số phép điều chỉnh vi phạm liên đới không vượt chiều cao h liên đới

Ở ố

– Ở giai đoạn giai đoạn số phép hiệu chỉnh không vượt n

ỴTrong trường hợp xấu độ phức tạp thuật tốn

(117)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ý t

• ShellSort phương pháp cải tiến phương pháp xếp chèn trực tiếp Ý tưởng phương pháp xếp Ý tưởng

p ự p g p g p p p p y

xem xét dãy ban đầu dãy gồm phần tử cách k vị trí; tiến hành xếp dãy con; giảm dần bước k đến k = Ỵ xếp xong

dần bước k đến k = ẻ sp xp xong

ã Dóy ban u : a0, a1, , an-1 xem xen kẽ dãy sau :

– Dãy thứ : a0 ak a2k

– Dãy thứ hai : a1 ak+1 a2k+1

(118)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ý tưởng

• Việc xếp phần tử dãy làm cho phần tử đưa vị trí tương đối (chỉ dãy so với toàn phần tử dãy ban đầu chưa Ý tưởng

con, so với toàn phần tử dãy ban đầu chưa đúng) cách nhanh chóng

• Khi khoảng cách k giảm tạo thành dãy mớig g y Ỵ phần tử so sánh với nhiều phần tử khác trước khơng dãy với

• Thuật tốn dừng sau xong dãy với k thuật tốn

• Thuật tốn dừng sau xong dãy với k = 1, thuật toán lúc thực thuật toán chèn trực tiếp Tuy nhiên, phần lớn phần tử dãy có thứ tự phận

(119)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Thuật toán

//input: dãy (a, n); dãy (h, k): k độ dài bước lặp - const //output: dãy (a, n) là được tăng dần

Thuật toán

//output: dãy (a, n) tăng dần

Bước 1: step = 1; //h[step]: độ dài bước lặp

Bước 2Bước 2: Trong (step: Trong (step ≤≤ k) k) //độ//độ dài bước >1dài bước >1Bước 21: len = h[step]; //lấy độ dài bước

Bước 22: Lặặp vp ới i=len+1 n-1 //sắp xp ếp dãy liên p y

đới bước len Chèn a[i] vào dãy liên đới bước len;

(120)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

h = (5, 3, 1); k = 3; len = 5;

Ví dụ

1 2 3 4 5 6 7

0

( , , ); ; ;

curr

joint

2 8 5 1 6 4 15

12

1 2 3 4 5 6 7

(121)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

h = (5, 3, 1); k = 3;

Ví dụ

len = 5;

1 2 3 4 5 6 7

0

( , , ); ; ;

2 8 5 1 12 4 15

6

1 2 3 4 5 6 7

(122)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

h = (5, 3, 1); k = 3;

Ví dụ

len = 3;

1 2 3 4 5 6 7

0

( , , ); ;

curr

joint

;

2 15 5 1 12 4 8

6

1 2 3 4 5 6 7

(123)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

Ví dụ

h = (5, 3, 1); k = 3; len = 3;

1 2 3 4 5 6 7

0 curr

joint joint

( , , ); ; ;

1 12 6 2 15 4 8

5

1 2 3 4 5 6 7

(124)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

Ví dụ

h = (5, 3, 1); k = 3; len = 3;

1 2 3 4 5 6 7

0

( , , ); ; ;

1 12 5 2 15 6 8

4

1 2 3 4 5 6 7

(125)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

Ví dụ

h = (5, 3, 1); k = 3; len = 1;

jointcurr

1 2 3 4 5 6 7

0

joint joint

( , , ); ; ;

1 12 5 2 15 6 8

4

1 2 3 4 5 6 7

(126)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

Ví dụ

h = (5, 3, 1); k = 3; len = 1;

jointcurr

joint

1 2 3 4 5 6 7

0

joint joint jointjoint joint joint

( , , ); ; ;

4 5 12 2 15 6 8

1

1 2 3 4 5 6 7

(127)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Ví dụ

Ví dụ

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

1

1 2 3 4 5 6 7

(128)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Cài đặt

void ShellSort(int a[], int n) {

int h[], k;

Cài đặt

int step, i, pos, x, len;

for (step = 0; step < k; step ++) {

ế

len = h[step]; //khoảng cách phần tử liên tiếp dãy con

for (i = len; i < n; i++) {

[i] x = a[i];

for(pos=i;(pos-len>=0)&&(x<a[pos-len]);pos-=len) a[pos] = a[pos-len];

(129)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Đá h iá

• Yếu tố định tính hiệu thuật tốn: Đánh giá

– Cách chọn khoảng cách h bước xếp

– Số bước xếp

• Giả sử định xếp k bước, khoảng cách chọn phải thỏa điều kiện :

(130)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Đá h iá

• Chưa có tiêu chuẩn rõ ràng việc lựa chọn dãy iá t ị kh ả h tốt hất Một ợi ý dã đượ Đánh giá

giá trị khoảng cách tốt Một gợi ý: dãy chọn khơng nên có số bội số

• Một số dãy Knuth đề nghị :

• Một số dãy Knuth đề nghị :

hi = (hi-1 - 1)/3 hk = 1, k = log3n-1

í d 121 40 13 ví dụ: 121, 40, 13, 4, hay

h (h 1)/2 h k l

(131)

2.3 Các gii thut sp xếp ni

2 Sp xếp chèn vi độ dài bước gim 2.3.8 Sp xếp chèn vi độ dài bước gim

dn - Shell sort

Đá h iá

• Việc đánh giá giải thuật Shellsort dẫn đến vấn

đề t h ất t thậ hí ột ố h đ Đánh giá

đề tốn học phức tạp, chí số chưa chứng minh

Hiệ ả ủ th ật t ò h th ộ dã độ

• Hiệu thuật tốn cịn phụ thuộc vào dãy độ

dài chọn

• Trong trường hợp chọn dãy độ dài theo cơng thức

• Trong trường hợp chọn dãy độ dài theo công thức

hi = (hi-1 - 1)/2 hk = 1, k = log2n-1

thì iải th ật ó độ t <<

(132)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ý tưởng

• Một vài hạn chế thuật toán Đổi chỗ trực tiếp:

– Mỗi lần đổi chỗ thay đổi cặp phần tử nghịch thế;

Ý tưởng

Mỗi lần đổi chỗ thay đổi cặp phần tử nghịch thế; trường hợp như: i < j < k ai > aj > ak (*) chỉ cần thực hiện lần

đổi chỗ (ai, ak): thuật tốn khơng làm

Độ t ủ th ật t O( 2) Ỵ khi đủ lớ th ật t á ẽ

– Độ phức tạp thuật tốn O(n2) Ỵ khi n đủ lớn thuật tốn sẽ

rất chậm

Ỵ Ý tưởng: phân chia dãy thành cácg p y đoạạn Ỉ tậận dụụngg

được phép đổi chỗ dạng (*) làm giảm độ dài dãy xếp Ỉ cải thiện đáng kể độ phức tạp thuật t

(133)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ý tưởng

• Giải thuật QuickSort xếp dãy a0, a1 , an-1 dựa việc phân hoạch dãy ban đầu thành phần:

Ý tưởng

phân hoạch dãy ban đầu thành phần:

– Phần 1: Gồm phần tử có giá trị khơng lớn x

– Phần 2: Gồm phần tử có giá trị x

Phầ Gồ hầ ó iá ị khô bé h

– Phần 3: Gồm phần tử có giá trị khơng bé x

với x giá trị phần tử tùy ý dãy ban đầu

• Sau thực phân hoạch dãy banSau thực phân hoạch, dãy ban đầuđầu phân thành 3được phân thành đoạn:

1 ak ≤ x , với k = j

2 ới k j i

(134)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ý tưởng

• Đoạn thứ có thứ tự Ý tưởng

• Nếu đoạn có phần tử chúng có thứ tự, dãy ban đầu

• Ngược lại, đoạn có nhiều phần tử

thì dãy ban đầu có thứ tự đoạn 1,

sắp

(135)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Thuật toán

//input: dãy (a, left, right)

//output: dãy (a left right) được tăng dần

Thuật toán

//output: dãy (a, left, right) được tăng dần

Bước 1: Nếu left ≥ right //dãy có phần tử Kết thúc; //dãy đã được xếp

Kết thúc; //dãy đã được xếp

Bước 2: Phân hoạch dãy aleft … aright thành đoạn: aleft aj, aj+1 ai 1, ai aright

aj, aj+1 ai-1, ai aright

//Đoạn 0x - Đoạn 2: aj+1 ai-1 = x - Đoạn 3: ai arightx

(136)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Phân hoạch dãy //input: dãy aleft, …, aright

//output: dãy chia thành 3 đoạn: đoạn 1 ≤ đoạn 2 ≤ đoạn 3

ầ ố

Phân hoạch dãy

Bước 1: Chọn tùy ý phần tử a[p] dãy giá trị mốc: x=a[p];

Bước 2: Duyệt từ đầu dãy để phát hiệu chỉnh cặp phần tử a[i], a[j]

vi phạmp điều kiệnệ

Bước 21: i = left; j = right;

Bước 22: Trong (a[i]<x) i++;

Bước 23: Trong (a[j]>x) j ;

Bước 23: Trong (a[j]>x) j ;

Bước 24: Nếu i<= j // a[i] ≥ x ≥ a[j] mà a[j] đứng sau a[i]

• Hoán vị (a[i],a[j]); i++; j ;

ế ế

(137)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick

Phân hoạch dãy

2.3.9 Sp xếp da phân hoch – Quick sort

Ví dụ

5

X

Phân hoạch dãy

Ví dụ

1 2 3 4 5 6 7

0i j

2 8 5 1 6 4 15

12

left right

(138)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ví dụ Phân hoạch dãy

5

X

Ví dụ Phân hoạch dãy

1 2 3 4 5 6 7

0 i j

2 8 5 1 6 12 15

4

left right

(139)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ví dụ

Ví dụ

1 2 3 4 5 6 7

0 j i

2 1 5 8 6 12 15

4

(140)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ví dụ Phân hoạch dãy

6

X

Ví dụ Phân hoạch dãy

1 2 3 4 5 6 7

0 i j

2 4 5 8 6 12 15

1

left right

STOP STOP

Sắp xếp đoạn 3 STOP STOP

(141)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ví dụ

Ví dụ

1 2 3 4 5 6 7

0 j i

2 4 5 6 8 12 15

1

left right

(142)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Ví dụ

Ví dụ

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

(143)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Cài đặt

void QuickSort(int a[], int left, int right)

{

int i, j, x;

Cài đặt

if (left >= right) return;

x = a[(left+right)/2]; // chọn phần tử làm giá trị mốc i = left; j = right;

while(i < j) {( j) {

while(a[i] < x) i++;

while(a[j] > x) j ;

if(i <= j) {

( [i] [j])

swap(a[i], a[j]); i++ ; j ;

} }

(144)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Nhận xét

• Về ngun tắc, chọn giá trị mốc x phần tử tùy ý dãy, để đơn giản, phần tử có vị trí thường Nhận xét

được chọn, p = (l + r) /

• Giá trị mốc x chọn có tác động đến hiệu thực thuật tốn định số lần phân hoạch

thuật tốn định số lần phân hoạch

– Số lần phân hoạch ta chọn x phần tử trung vị (median), nhiều x cực trị dãy

(145)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Đánh giá

• Hiệu phụ thuộc vào việc chọn giá trị mốc:

– Trường hợp tốt nhất: lần phân hoạch chọn

Đánh giá

Trường hợp tốt nhất: lần phân hoạch chọn phần tử median làm mốc, dãy phân chia thành phần cần log2(n) lần phân hoạch

ắ ế

thì xếp xong

– Nếu lần phân hoạch chọn phần tử có giá trị cực

đ i (h tiể ) ố Ỵ dã ẽ bị hâ hi h

(146)

2.3 Các gii thut sp xếp ni

2 Sp xếp da phân hoch Quick 2.3.9 Sp xếp da phân hoch – Quick

sort

Độ hứ t th ật t á

Độ phức tạp thuật toán

Trường hợp Độ phức tạp

Tốt nhất O(nlogn)

Trung bình O(nlogn)

Xấu nhất O(n2)

(147)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ý tưởng

• Giải thuật Merge sort xếp dãy a0, a1, , an-1 dựa trên nhận xét sau:

Ý tưởng

nhận xét sau:

• Mỗi dãy a0, a1, , an-1 bất kỳ là tập hợp dãy con liên tiếp mà mp ỗi dãy cony đều đã có thứ tựự.

– Ví dụ: dãy 12, 2, 8, 5, 1, 6, 4, 15 coi gồm dãy không giảm (12); (2, 8); (5); (1, 6); (4, 15)

• Dãy có thứ tự coi có dãy

• Hướng tiếp cận: tìm cách làm giảm số dãy khơng

(148)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ý tưởng

• Các vấn đề cần giải quyết:

– Phương án phân hoạch dãy ban đầu thành dãy

– Phương án làm giảm số dãy

Ý tưởng

Phương án làm giảm số dãy

• Phân hoạch dãy ban đầu thành dãy tăng dần:

– Phương án 1: Phân hoạch dãy theo đường chạy Ỉ xếp trộn tự

nhiên

– Phương án 2: Phân hoạch thành dãy có số phần tử (1, 2, 4, …) Æ xếp trộn trực tiếp

• Làm giảm số dãy con:

– Các dãy tăng dần tách dãy phụ theo nguyên tắc phân phối đều luân phiên.

(149)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Thuật toán

//input: dãy (a, n)

//output: dãy (a, n) được tăng dần

Thuật toán

• Bước : k = 1; // dãy có phần tử là dãy khơng giảm

• Bước : Lặp (k < n) // dãy dãy con

h hối đề l hi d h h d b

– Bước 21: Phân phối luân phiên dãy a0, a1, …, an-1 thành dãy b, c theo nhóm k phần tử liên tiếp

//b = a00, …, ak-1k 1, a2k2k, …, a3k-13k 1, … //c = ak, …, a2k-1, a3k, …, a4k-1, …

– Bước 22: Trộn cặp dãy gồm k phần tử dãy b, c vào a B 23 k k*2

(150)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 1; Phân phối luân phiên Ví dụ

1 2 3 4 5 6 7

0

;

2 8 5 1 6 4 15

(151)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 1; Phân phối luân phiên Ví dụ

1 2 3 4 5 6 7

0

;

2 8 5 1 6 4 15

(152)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 1; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

;

8 1 4

12

(153)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 1; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

8 1 4

12

(154)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 2; Phân phối luân phiên Ví dụ

1 2 3 4 5 6 7

0

;

12 5 8 1 6 4 15

(155)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 2; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

12 1 6

2

(156)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 2; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

12 1 6

2

(157)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 4; Phân phối luân phiên Ví dụ

1 2 3 4 5 6 7

0

;

5 8 12 1 4 6 15

(158)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 4; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

5 8 12

2

(159)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 4; Trộn cặp đường chạy Ví dụ

1 2 3 4 5 6 7

0

;

5 8 12

2

(160)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

k = 8;

Ví dụ

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

1

STOP

(161)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Ví dụ

Ví dụ

1 2 3 4 5 6 7

0

2 4 5 6 8 12 15

(162)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Cài đặt

• Dữ liệu hỗ trợ: mảng b, c:

int b[MAX], c[MAX], nb, nc;

Cài đặt

• Các hàm cần cài đặt:

MergeSort: Sắp xếp mảng (a, n) tăng dần

void MergeSort(int a[], int n);

ố ề

Distribute: Phân phối luân phiên dãy độ dài k từ mảng

a vào hai mảng b c

void Distribute(int a[], int n,

int &nb int &nc int k);

int &nb, int &nc, int k);

Merge: Trộn mảng b mảng c vào mảng a

void Merge(int a[], int nb, int nc, int k);

(163)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Cài đặt

// khai báo mảng phụ

int b[MAX], c[MAX], nb, nc;

Cài đặt

[ ], [ ], , ;

void MergeSort(int a[], int n) {

{

int k;

for (k = 1; k < n; k *= 2) {

{

Distribute(a, n, nb, nc, k);

Merge(a, nb, nc, k);

(164)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Cài đặt

void Distribute(int a[], int n,

int &nb, int &nc, int k) {

Cài đặt

{

int i, pa, pb, pc; pa = pb = pc = 0;

while (pa < n)(p ) {

for (i=0; (pa<n) && (i<k); i++, pa++, pb++) b[pb] = a[pa];

b[pb] a[pa];

for (i=0; (pa<n) && (i<k); i++, pa++, pc++) c[pc] = a[pa];

(165)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Cài đặt

void Merge(int a[], int nb, int nc, int k) {

Cài đặt

int pa, pb, pc; pa = pb = pc = 0;

while ((pb < nb) && (pc < nc))

while ((pb < nb) && (pc < nc))

MergeSubarr(a, nb, nc, pa, pb, pc, k);

while (pb < nb)

a[pa ++] = b[pb ++];

while (pc < nc)

(166)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Cài đặt

void MergeSubarr(int a[], int nb, int nc,

int &pa, int &pb, int &pc, int k) {

Cài đặt

{

int rb, rc;

rb = min(nb, pb+k); rc = min(nc, pb+k);

while ((pb < rb) && (pc < rc))

while ((pb < rb) && (pc < rc))

if (b[pb] < c[pc])

a[pa ++] = b[pb ++];

else a[pa ++] = c[pc ++];

while (pb < rb)

a[pa ++] = b[pb ++];

while (pc < rc)

(167)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Đánh giá

Giải thuật trộn trực tiếp phương pháp trộn đơn giản nhất:

• Việc phân hoạch thành dãy tách dãy thành

Đánh giá

dãy khơng giảm độ dài k

• Độ dài dãy 1, 2, 4, 8, … đảm bảo dãy dãy không giảm sau bước tách trộn

dãy không giảm sau bước tách - trộn

• Khơng sử dụng thông tin thứ tự dãy ban đầu

→ hệệ quả:q

• Độ phức tạp thuật tốn khơng phụ thuộc vào dãy ban đầu

• Một dãy khơng giảm có sẵn bị chia nhỏ thành

ầ ế ế

(168)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Đánh giá

• Số lần thực việc chia luân phiên trộn:

ỗ ầ

Đánh giá

• Sau lần tách – trộn, độ dài K dãy tăng gấp đôi Æ Số lần tách – trộn thuật toán: log2n

• Chi phí thực tách - trộn tỉ lệ thuận với n

(169)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Đánh giá

• Một nhược điểm lớn thuật tốn trộn cài đặt thuật tốn địi hỏi thêm Đánh giá

trộn cài đặt thuật tốn địi hỏi thêm khơng gian nhớ để lưu dãy phụ b, c

• Hạn chế khó chấp nhận thực tế

• Hạn chế khó chấp nhận thực tế dãy cần xếp thường có kích thước lớn

Vì ậ th ật t t ộ th đ dù để

• Vì thuật tốn trộn thường dùng để

sắp xếp cấu trúc liệu khác phù hợp h d h h liê kết h ặ fil

(170)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Sắp xếp trộn tự nhiên – Natural Merge Sort

• Một đường chạy dãy số a dãy không giảm cực đại a Nghĩa là, đường chạy r = (ai, ai+1, …, aj) phải

Sắp xếp trộn tự nhiên Natural Merge Sort

j

thỏa điều kiện:

akak+1 ∀k ∈[i, j)

⎪ ⎩ ⎪ ⎨ > < − 1 i i a a a a

• Ví dụ dãy 12, 2, 8, 5, 1, 6, 4, 15 coi gồm đường

⎩ >a j aj+1

ụ y , , , , , , , g g

(171)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Sắp xếp trộn tự nhiên – Natural Merge Sort

• Thuật tốn trộn tự nhiên khác thuật tốn trộn

iế hỗ h ì l ô ứ hắ hâ

Sắp xếp trộn tự nhiên Natural Merge Sort

trực tiếp chỗ thay ln cứng nhắc phân hoạch theo dãy có chiều dài k, việc phân

h h h đ ị đ h hỉ ầ

hoạch theo đơn vị đường chạy ta cần biết số đường chạy a sau lần phân hoạch

ối ù ó hể biế hời điể dừ ủ

cuối biết thời điểm dừng thuật tốn dãy có thứ tự dãy có

đ h

(172)

2.3 Các gii thut sp xếp ni

2.3.10 Sp xếp theo phương pháp trn trc 2.3.10 Sp xếp theo phương pháp trn trc

tiếp – Merge sort

Sắp xếp trộn tự nhiên – Natural Merge Sort

• Bước : // Chuẩn bị

r = 0; // r dùng để đếm số dường chạy

Sắp xếp trộn tự nhiên Natural Merge Sort

; g g ạy

• Bước : Tách dãy a1, a2, …, an thành dãy b, c theo nguyên tắc luân phiên đường chạy:

– Bước 2.1 :

• Phân phối cho b đường chạy; r = r+1;

• Nếu a cịn phần tử chưa phân phối

– Phân phối cho c đường chạy; r = r+1;

– Bước 2.2 : Nếu a phần tử: quay lại bước 2.1;

• Bước : Trộn cặp đường chạy dãy b c vào a

(173)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ý tưởng

• Radix Sort thuật tốn tiếp cận theo hướng hồn tồn khác

Ý tưởng

• Nếu thuật tốn khác, sở để xếp việc so sánh giá trị phần tử Radix

l i d ắ h l i h b

Sort lại dựa nguyên tắc phân loại thư bưu

điện Vì lý Radix Sort cịn có tên Postman’s sort

sort

• Radix Sort không quan tâm đến việc so sánh giá trị

của phần tử mà thân việc phân loại trình tự

(174)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ý tưởng

• Để chuyển khối lượng thư lớn đến tay người nhận nhiều địa phương khác nhau, bưu điện thường tổ chức hệ thống

Ý tưởng

phân loại thư phân cấp

• Trước tiên, thư đến tỉnh, thành phố chung vào lô để gửi đến tỉnh thành tương ứng

chung vào lô để gửi đến tỉnh thành tương ứng

• Bưu điện tỉnh thành lại thực công việc tương tự Các thư đến quận, huyện xếp vào chung lô gửi đến quận, huyện tương ứng

(175)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ý tưởng

• Mơ lại qui trình trên, để xếp dãy a0, a1, , iải th ật R di S t thự hiệ hư

Ý tưởng

an-1, giải thuật Radix Sort thực sau:

– Trước tiên, ta giả sử phần tử ai dãy a0, a1 a 1 số nguyên có tối đa m chữ số

a1, , an-1 số nguyên có tối đa m chữ số

– Ta phân loại phần tử theo chữ số hàng

(176)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Thuật tốn

• Bước :// k cho biết chữ số dùng để phân loại hành k = 0; // k = 0: hàng đơn vị; k = 1: hàng chục; … Thuật toán

; g ị; g ụ ;

• Bước : //Tạo lô chứa loại phần tử khác Khởi tạo 10 lô B0, B1, …, B9 rỗng;

• Bước : For i = n-1

Đặt ai vào lô Bt với t: chữ số thứ k ai;

B Nối B B B l i (th đú t ì h t ) h

• Bước : Nối B0, B1, …, B9 lại (theo trình tự) thành a

• Bước : k = k+1;

(177)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ví dụ

(178)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ví dụ

(179)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ví dụ

(180)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ví dụ

(181)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Ví dụ

(182)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Đánh giá

• Với dãy n số, số có tối đa m chữ số, thuật toán thực m lần thao tác phân lô Đánh giá

thuật tốn thực m lần thao tác phân lơ ghép lô

T th tá hâ lô ỗi hầ tử hỉ đ

• Trong thao tác phân lô, phần tử xét lần, ghép

(183)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Nhận xét

• Sau lần phân phối thứ k phần tử A vào lô B0, B1, …, B9, lấy ngược trở ra, xét đến Nhận xét

0 y g

k+1 chữ số phần tử A, ta có mảng tăng dần nhờ trình tự lấy từ → Nhận xét

à bả đả í h đú đắ ủ h ậ bảo đảm tính đắn thuật tốn

• Thuật tốn có độ phức tạp tuyến tính nên hiệu

ắ dã ố ất hiề hầ tử hất khó ắ ế

sắp dãy cố nhiều phần tử, khóa xếp khơng q dài so với số lượng phần tử (điều thường gặp thực tế)

(184)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Nhận xét

• Thuật tốn khơng có trường hợp xấu tốt Mọi dãy số với chi phí

Nhận xét

tốt Mọi dãy số với chi phí chúng có số phần tử khóa có chiều dài

khóa có chiều dài

• Thuật tốn cài đặt thuận tiện với mảng với khóa xếp chuỗi (ký tự hay số) khóa xếp chuỗi (ký tự hay số) khóa số ví dụ tránh chi phí lấy chữ số số

(185)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Nhận xét

• Số lượng lơ lớn (10 dùng số thập phân, 26

khi dù h ỗi ký t tiế A h ) h

Nhận xét

khi dùng chuỗi ký tự tiếng Anh, …) tổng kích thước tất lơ dãy

b đầ ê t khô thể dù ả để biể

ban đầu nên ta dùng mảng để biểu diễn B Như vậy, phải dùng cấu trúc liệu

độ để biể diễ B ⇒ R di S t ất thí h

(186)

2.3 Các gii thut sp xếp ni

2.3.11 Sp xếp theo phương pháp cơ s 2.3.11 Sp xếp theo phương pháp cơ s

Radix sort

Nhận xét

• Người ta dùng phương pháp phân lô theo

ể ễ ắ ế

Nhận xét

biểu diễn nhị phân khóa xếp Khi ta dùng hồn tồn cấu trúc liệu mảng

ể ể ễ ầ

để biểu diễn B cần dùng hai lơ B0 B1 Tuy nhiên, chiều dài khóa lớn Khi

ắ ề ầ

Ngày đăng: 30/05/2021, 13:31

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w