1. Trang chủ
  2. » Thể loại khác

Tài liệu Slide Sap Xep docx

65 320 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Các Giải Thuật Sắp Xếp
Trường học Trường Đại học Bách Khoa Hà Nội
Chuyên ngành Kỹ thuật lập trình
Thể loại Tài liệu môn học
Thành phố Hà Nội
Định dạng
Số trang 65
Dung lượng 3,85 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

ĐỔI CHỔ TRỰC TIẾP – INTERCHANGE SORTÝ tưởng chính của giải thuật là xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ phần tử này với phần

Trang 1

CÁC GIảI THUậT SắP XếP

1

Trang 2

1 CÁC KHÁI NIệM

 Sắp xếp là quá trình xử lý một danh sách các phần tử

(hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa mãn

một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ

Trang 3

2 CÁC GIẢI THUẬT SẮP XẾP CƠ BẢN

 Đổi chổ trực tiếp – Interchange Sort

 Chọn trực tiếp – Selection Sort

 Chèn trực tiếp – Insertion Sort

 Quick Sort

 Nổi bọt – Buble Sort

 Một số giải thuật khác đọc thêm trong tài liệu

3

Trang 4

ĐỔI CHỔ TRỰC TIẾP – INTERCHANGE SORT

Ý tưởng chính của giải thuật là xuất phát từ đầu dãy, tìm

tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng

cách đổi chỗ phần tử này với phần tử tương ứng trong cặp

nghịch thế Lặp lại xử lý trên với các phần tử tiếp theo

trong dãy

4

Trang 5

1 2 3 4 5 6 7 8

j i=1

5

Xét phần tử đầu tiên (vị trí 1)

Trang 6

1 2 3 4 5 6 7 8

j i=2

6

Xét phần tử thứ hai (vị trí 2)

Trang 7

1 2 3 4 5 6 7 8

j i=3

7

Xét phần tử thứ ba (vị trí 3)

Trang 8

1 2 3 4 5 6 7 8

j i=4

8

Xét phần tử thứ tư (vị trí 4)

Trang 9

1 2 3 4 5 6 7 8

j i=5

9

Xét phần tử thứ năm (vị trí 5)

Trang 10

1 2 3 4 5 6 7 8

j i=6

10

Xét phần tử thứ sáu (vị trí 6)

Trang 11

1 2 3 4 5 6 7 8

j i=7

11

Xét phần tử thứ bảy (vị trí 7)

Trang 12

của mảng

Trang 13

Giải thuật

Bước 1 : i = 1;// bắt đầu từ đầu dãy

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

Bước 3 :

Trong khi j <= N thực hiện

Nếu a[j]<a[i]: Hoán vị a[i], a[j];

Trang 15

Ðánh giá giải thuật

Số lượng các phép so sánh xảy ra không phụ thuộc vào

tình trạng của dãy số ban đầu, nhưng số lượng phép hoán

vị thực hiện tùy thuộc vào kết qủa so sánh, có thể ước

lượng trong từng trường hợp như sau :

15

Trang 16

CHỌN TRỰC TIẾP – SELECTION SORT

một trong những cách sắp xếp 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 phần tử này về vị trí đúng là đầu dãy hiện hành ; sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn

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

Dãy ban đầu có N phần tử, vậy tóm tắt ý tưởng

nhất trong dãy hiện hành về vị trí đúng ở đầu dãy 16

Trang 25

Giải thuật

Bước 1 : i = 1;

Bước 2 : Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[N]

Bước 3 : Hoán vị a[min] và a[i]

Trang 27

Ðánh giá giải thuật

Ðối với giải thuật chọn trực tiếp, có thể thấy rằng ở lượt thứ i, bao giờ cũng cần (n-i) lần so sánh để xác định phần tử nhỏ nhất hiện hành Số lượng phép so sánh này không phụ thuộc vào tình trạng của dãy số ban đầu, do vậy trong mọi trường hợp có thể kết luận :

27

Trang 28

CHÈN TRỰC TIẾP – INSERTION SORT

Cho dãy ban đầu a1 , a2 , ,an, ta có thể

xem như đã có đoạn gồm một phần tử a1

đã được sắp, sau đó thêm a2 vào đoạn a1 sẽ

có đoạn a1 a2 được sắp; tiếp tục thêm a3 vào đoạn a1 a2 để có đoạn a1 a2 a3 được

sắp; tiếp tục cho đến khi thêm xong aN vào

đoạn a1 a2 aN-1 sẽ có dãy a1 a2 aN được sắp

28

Trang 38

void InsertionSort(int a[], int N )

{

int pos;

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

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

{

x = a[i]; pos = i-1;

// tìm vị trí chèn xwhile((pos >= 0)&&(a[pos] > x)){

// kết hợp dời chỗ các phần tử sẽ đứng sau x trong dãy mới

a[pos+1] = a[pos];

pos ;

}a[pos+1] = x;// chèn x vào dãy}

}

38

Trang 39

Đánh giá giải thuật

Ðối với giải thuật chèn trực tiếp, các phép so sánh xảy ra

trong mỗi vòng lặp while tìm vị trí thích hợp pos, và mỗi

lần xác định vị trí đang xét không thích hợp, sẽ dời chỗ

phần tử a[pos] tương ứng Giải thuật thực hiện tất cả N-1

vòng lặp while, do số lượng phép so sánh và dời chỗ này

phụ thuộc vào tình trạng của dãy số ban đầu, nên chỉ có

thể ước lượng trong từng trường hợp như sau :

39

Trang 40

NỔI BỌT – BUBBLE SORT

Xuất phát từ cuối dãy , đổi chỗ các cặp

phần tử kế cận để đưa phần tử nhỏ

hơn trong cặp phần tử đó về vị trí

đúng đầu dãy hiện hành , sau đó sẽ

không xét đến nó ở bước tiếp theo, do

vậy ở lần xử lý thứ i sẽ có vị trí đầu

dãy là i Lặp lại xử lý trên cho đến khi

không còn cặp phần tử nào để xét 40

Trang 41

1 2 3 4 5 6 7

8

41

7 3 9 2 15 1

10 5 i

j

Trang 42

1 2 3 4 5 6 7

8

42

7 3 9 2 15

1 10 5 i

j

Trang 43

1 2 3 4 5 6 7

8

43

7 3 9 2

15

1

10 5 i

j

Trang 44

1 2 3 4 5 6 7

8

44

7 3

9 2

15

1

10 5 i

j

Trang 45

1 2 3 4 5 6 7

8

45

7 3

9 2

15

1

10

5 i

j

Trang 46

1 2 3 4 5 6 7

8

46

7 3

9 2

15

1

10

5 i

j

Trang 47

1 2 3 4 5 6 7

8

47

7 3

9 2

Trang 48

1 2 3 4 5 6 7

8

48

7 3

9 2

15

1

10 5

i

Trang 49

Trong khi ( j > i ) thực hiện:

Trang 51

Đánh giá giải thuật

Trang 53

SẮP XẾP NHANH – QUICKSORT

dãy bên phải

(x là phần tử trong dãy)

53

Trang 54

L=1 R=3

L=4 R=8

Trang 55

L=5 R=8

Đoạn 1 Đoạn 2

Trang 61

Kết thúc

Trang 62

Nếu (L<j) Phân hoạch dãy aL … aj

Nếu (i<R) Phân hoạch dãy ai … aR

62

Trang 63

Giải thuật phân hoạch dãy a L , a L+1 , … a R thành 2 dãy con

Phát hiện và hiệu chỉnh cặp a[i] và a[j] nằm sai chỗ:

Bước 3:

Nếu i<j: Lặp lại bước 2

Trang 64

Cài đặt

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

while(a[j]>x) j ;

if(i<=j) {

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

} } while(i<j);

}

64

Trang 65

Đánh giá giải thuật

Chi phí trung bình O(n*log2n)

Chi phí cho trường hợp xấu nhất O(n2)

Chi phí tùy thuộc vào cách chọn phần tử

Ngày đăng: 12/12/2013, 11:15

TỪ KHÓA LIÊN QUAN

w