c2 sap xep

59
CHƯƠNG 2: SẮP XẾP (SORTING) Giáo viên: PHẠM TUẤN HIỆP Giáo viên: PHẠM TUẤN HIỆP CTDL&GT

Upload: hiep0109

Post on 22-May-2015

1.760 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: C2 sap xep

CHƯƠNG 2: SẮP XẾP (SORTING)

Giáo viên: PHẠM TUẤN HIỆPGiáo viên: PHẠM TUẤN HIỆPCTDL&GT

Page 2: C2 sap xep

Nội dung

Tổng quan Các phương pháp sắp xếp thông dụng

Chương 2: Sắp xếp

2

Page 3: C2 sap xep

Tổng quan

Tại sao phải sắp xếp? Để có thể sử dụng thuật toán tìm nhị phân

Để thực hiện thao tác nào đó được nhanh hơn

Định nghĩa bài toán sắp xếp Sắp xếp là quá trình xử lý một danh sách các phần tử để đặ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ữ tại mỗi phần tử

3

Chương 2: Sắp xếp

Page 4: C2 sap xep

Khái niệm nghịch thế: Xét một mảng các số a[0], a[1], … a[n-1] Nếu có i<j và a[i] > a[j], thì ta gọi đó là một nghịch thế

Mảng chưa sắp xếp sẽ có nghịch thế Mảng đã có thứ tự sẽ không chứa nghịch thế

a[0] a[1] … a[n -1]

4

Tổng quan

Chương 2: Sắp xếp

Page 5: C2 sap xep

Các phương pháp sắp xếp thông dụng

Phương pháp Đổi chỗ trực tiếp (Interchange sort) Phương pháp Nổi bọt (Bubble sort) Phương pháp Chèn trực tiếp (Insertion sort) Phương pháp Chọn trực tiếp (Selection sort) Phương pháp dựa trên phân hoạch (Quick sort)

5

Chương 2: Sắp xếp

Page 6: C2 sap xep

Interchange Sort – Ý tưởng

Nhận xét: Để sắp xếp một dãy số, ta có thể xét các nghịch thế có trong dãy

và làm triệt tiêu dần chúng đi Ý tưởng:

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

6

Chương 2: Sắp xếp

Page 7: C2 sap xep

Interchange Sort – Ví dụ

2 8 5 1 6 4 15

12

1 2 3 4 5 6 70

i

j

1

Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

7

Chương 2: Sắp xếp

Page 8: C2 sap xep

12

8 5 2 6 4 15

1

1 2 3 4 5 6 70

i

j

2

Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

Interchange Sort – Ví dụ8

Chương 2: Sắp xếp

Page 9: C2 sap xep

Interchange Sort – Ví dụ

2 12

8 5 6 4 15

1

1 2 3 4 5 6 70

i

j

4

Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

9

Chương 2: Sắp xếp

Page 10: C2 sap xep

Interchange Sort – Ví dụ

2 4 12

8 6 5 15

1

1 2 3 4 5 6 70

i

j

5

Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

10

Chương 2: Sắp xếp

Page 11: C2 sap xep

Interchange Sort – Ví dụ

2 4 5 6 8 12

15

1

1 2 3 4 5 6 70

Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]

11

Chương 2: Sắp xếp

Page 12: C2 sap xep

Interchange Sort – Thuật toán

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

// output: dãy (a, n) đã được sắp xếp Bước 1: i = 0; // bắt đầu từ đầu dãy Bước 2: j = i+1; Bước 3: Trong khi j < n thực hiện:

Nếu a[i]>a[j] thì đổi chỗ a[i], a[j] j = j+1;

Bước 4: i = i+1; Nếu (i < n-1): Lặp lại Bước 2 Ngược lại: Dừng

12

Chương 2: Sắp xếp

Page 13: C2 sap xep

Interchange Sort - Cài đặt

void InterchangeSort(int a[], int n){for (int i=0 ; i<n-1 ; i++)

for (int j=i+1; j<n ; j++) if(a[j]<a[i]) //nếu có nghịch thế thì đổi chỗ

HoanVi(a[i], a[j]);}void HoanVi(int &a, int &b){

int temp = a; a = b; b = temp;

}

13

Chương 2: Sắp xếp

Page 14: C2 sap xep

Các phương pháp sắp xếp thông dụng

Phương pháp Đổi chỗ trực tiếp (Interchange sort) Phương pháp Nổi bọt (Bubble sort) Phương pháp Chèn trực tiếp (Insertion sort) Phương pháp Chọn trực tiếp (Selection sort) Phương pháp dựa trên phân hoạch (Quick sort)

14

Chương 2: Sắp xếp

Page 15: C2 sap xep

Bubble Sort – Ý tưởng

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í đầu dãy hiện hành, sau đó sẽ không xét đến nó ở bước tiếp theo

Ở lần xử lý thứ i 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

15

Chương 2: Sắp xếp

Page 16: C2 sap xep

Bubble Sort – Ví dụ

2 8 5 1 6 4 15

12

1 2 3 4 5 6 70

i

j

1

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

16

Chương 2: Sắp xếp

Page 17: C2 sap xep

Bubble Sort – Ví dụ

12

2 8 5 4 6 15

1

1 2 3 4 5 6 70

i

j

2

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

17

Chương 2: Sắp xếp

Page 18: C2 sap xep

Bubble Sort – Ví dụ

2 12

4 8 5 6 15

1

1 2 3 4 5 6 70

i

j

4

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

18

Chương 2: Sắp xếp

Page 19: C2 sap xep

Bubble Sort – Ví dụ

2 4 12

8 5 6 15

1

1 2 3 4 5 6 70

i

j

5

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

19

Chương 2: Sắp xếp

Page 20: C2 sap xep

Bubble Sort – Ví dụ

2 4 5 12

8 6 15

1

1 2 3 4 5 6 70

i

j

6

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

20

Chương 2: Sắp xếp

Page 21: C2 sap xep

Bubble Sort – Ví dụ

2 4 5 6 12

8 15

1

1 2 3 4 5 6 70

i

j

8

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

21

Chương 2: Sắp xếp

Page 22: C2 sap xep

Bubble Sort – Ví dụ

2 4 5 6 8 12

15

1

1 2 3 4 5 6 70

i

j

15

12

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

22

Chương 2: Sắp xếp

Page 23: C2 sap xep

Bubble Sort – Thuật toán

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

// output: dãy (a, n) đã được sắp xếp Bước 1: i = 0; Bước 2: j = n-1; //Duyệt từ cuối dãy ngược về vị trí i

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

Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]

j = j-1;

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

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

Ngược lại: Lặp lại Bước 2

23

Chương 2: Sắp xếp

Page 24: C2 sap xep

Bubble Sort - Cài đặt

void BubbleSort(int a[], int n)

{

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

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

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

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

}

24

Chương 2: Sắp xếp

Page 25: C2 sap xep

Các phương pháp sắp xếp thông dụng

Phương pháp Đổi chỗ trực tiếp (Interchange sort) Phương pháp Nổi bọt (Bubble sort) Phương pháp Chèn trực tiếp (Insertion sort) Phương pháp Chọn trực tiếp (Selection sort) Phương pháp dựa trên phân hoạch (Quick sort)

25

Chương 2: Sắp xếp

Page 26: C2 sap xep

Insertion Sort – Ý tưởng

Nhận xét: Mọi dãy a[0] , a[1] ,..., a[n-1] luôn có i-1 phần tử đầu tiên a[0] ,

a[1] ,... , a[i-2] đã có thứ tự (i ≥ 2)

Ý tưởng chính: Tìm cách chèn phần tử a[i] vào vị trí thích hợp của đoạn đã được

sắp để có dãy mới a[0] , a[1] ,... , a[i-1] trở nên có thứ tự

Vị trí này chính là pos thỏa :

a[pos-1] a[i ]< a[pos] (1posi)

26

Chương 2: Sắp xếp

Page 27: C2 sap xep

Insertion Sort – Ý tưởng

Chi tiết hơn: Dãy ban đầu a[0] , a[1] ,..., a[n-1], xem như đã có đoạn gồm một

phần tử a[0] đã được sắp

Thêm a[1] vào đoạn a[0] sẽ có đoạn a[0] a[1] được sắp

Thêm a[2] vào đoạn a[0] a[1] để có đoạn a[0] a[1] a[2] được sắp

Tiếp tục cho đến khi thêm xong a[n-1] vào đoạn a[0] a[1] ...a[n-1]

sẽ có dãy a[0] a[1]….... A[n-1] được sắp

27

Chương 2: Sắp xếp

Page 28: C2 sap xep

Insertion Sort – Ví dụ

2 8 5 1 6 4 15

12

1 2 3 4 5 6 70

28

Chương 2: Sắp xếp

Page 29: C2 sap xep

Insertion Sort – Ví dụ

2 8 5 1 6 4 15

12

i

x

1 2 3 4 5 6 70pos

2

Chèn a[1] vào (a[0], a[1])29

Chương 2: Sắp xếp

Page 30: C2 sap xep

Insertion Sort – Ví dụ

12

8 5 1 6 4 15

2

i

x

1 2 3 4 5 6 70pos

Chèn a[2] vào (a[0] … a[2])

8

30

Chương 2: Sắp xếp

Page 31: C2 sap xep

Insertion Sort – Ví dụ

8 12

5 1 6 4 15

2

i

x

1 2 3 4 5 6 70pos

Chèn a[3] vào (a[0] … a[3])

5

31

Chương 2: Sắp xếp

Page 32: C2 sap xep

Insertion Sort – Ví dụ

5 8 12

1 6 4 15

2

i

x

1 2 3 4 5 6 70pos

Chèn a[4] vào (a[0] … a[4])

1

32

Chương 2: Sắp xếp

Page 33: C2 sap xep

Insertion Sort – Ví dụ

2 5 8 12

6 4 15

1

i

x

1 2 3 4 5 6 70pos

Chèn a[5] vào (a[0]… a[5])

6

33

Chương 2: Sắp xếp

Page 34: C2 sap xep

Insertion Sort – Ví dụ

2 5 6 8 12

4 15

1

i

x

1 2 3 4 5 6 70pos

Chèn a[6] vào (a[0] … a[6])

4

34

Chương 2: Sắp xếp

Page 35: C2 sap xep

Insertion Sort – Ví dụ

2 4 5 6 8 12

15

1

i

x

1 2 3 4 5 6 70pos

Chèn a[7] vào (a[0] … a[7])

15

35

Chương 2: Sắp xếp

Page 36: C2 sap xep

Insertion Sort – Ví dụ

2 4 5 6 8 12

15

1

pos1 2 3 4 5 6 70

36

Chương 2: Sắp xếp

Page 37: C2 sap xep

Insertion Sort – Thuật toán

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

// output: dãy (a, n) đã được sắp xếp Bước 1: i = 1; // giả sử có đoạn a[0] đã được sắp Bước 2: x = a[i]; //Tìm vị trí pos thích hợp trong đoạn a[0]

//đến a[i] để chèn x vào Bước 3: Dời chỗ các phần tử từ a[pos] đến a[i-1] sang

phải 1 vị trí để dành chỗ cho x Bước 4: a[pos] = x; // có đoạn a[0]..a[i] đã được sắp Bước 5: i = i+1;

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

Ngược lại: Dừng

37

Chương 2: Sắp xếp

Page 38: C2 sap xep

Insertion Sort – Cài đặt

void InsertionSort(int a[], int n){int pos, x;for(int i=1; i<n; i++) //đoạn a[0] đã sắp{

x = a[i]; pos = i;while(pos>0 && x<a[pos-1]){ a[pos] = a[pos-1]; // dời chỗpos--;}a[pos] = x;

}}

38

Chương 2: Sắp xếp

Page 39: C2 sap xep

Các phương pháp sắp xếp thông dụng

Phương pháp Đổi chỗ trực tiếp (Interchange sort) Phương pháp Nổi bọt (Bubble sort) Phương pháp Chèn trực tiếp (Insertion sort) Phương pháp Chọn trực tiếp (Selection sort) Phương pháp dựa trên phân hoạch (Quick sort)

39

Chương 2: Sắp xếp

Page 40: C2 sap xep

Selection Sort – Ý tưởng

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

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

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 dãy hiện hành... đến khi dãy hiện hành chỉ còn 1 phần tử

40

Chương 2: Sắp xếp

Page 41: C2 sap xep

Selection Sort – Ví dụ

2 8 5 1 6 4 15

12

i

min1 2 3 4 5 6 70

Find MinPos(0, 7) Swap(a[i], a[min])41

Chương 2: Sắp xếp

Page 42: C2 sap xep

Selection Sort – Ví dụ

2 8 5 12

6 4 15

1

i

min1 2 3 4 5 6 70

Find MinPos(1, 7) Swap(a[i], a[min])42

Chương 2: Sắp xếp

Page 43: C2 sap xep

Selection Sort – Ví dụ

2 8 5 12

6 4 15

1

i

min1 2 3 4 5 6 70

Find MinPos(2, 7) Swap(a[i], a[min])43

Chương 2: Sắp xếp

Page 44: C2 sap xep

Selection Sort – Ví dụ

2 4 5 12

6 8 15

1

i

min1 2 3 4 5 6 70

Find MinPos(3, 7) Swap(a[i], a[min])44

Chương 2: Sắp xếp

Page 45: C2 sap xep

Selection Sort – Ví dụ

2 4 5 12

6 8 15

1

i

min1 2 3 4 5 6 70

Find MinPos(4, 7) Swap(a[i], a[min])45

Chương 2: Sắp xếp

Page 46: C2 sap xep

Selection Sort – Ví dụ

2 4 5 6 12

8 15

1

i

min1 2 3 4 5 6 70

Find MinPos(5, 7) Swap(a[i], a[min])46

Chương 2: Sắp xếp

Page 47: C2 sap xep

Selection Sort – Ví dụ

2 4 5 6 8 12

15

1

i

min1 2 3 4 5 6 70

Find MinPos(6, 7) Swap(a[i], a[min])

12

15

47

Page 48: C2 sap xep

Selection Sort – Thuật toán

// input: dãy (a, n)// output: dãy (a, n) đã được sắp xếp

Bước 1 : i = 0 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-1] Bước 3 : Nếu min i: Đổi chỗ a[min] và a[i] Bước 4 : Nếu i < n:

i =i+1 Lặp lại Bước 2

Ngược lại: Dừng. //n phần tử đã nằm đúng vị trí

48

Page 49: C2 sap xep

Selection Sort – Cài đặt

void SelectionSort(int a[], int n){int min; // chỉ số phần tử nhỏ nhất trong dãy hiện 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]) min = j; // ghi nhận vị trí phần tử nhỏ nhất

if (min != i) HoanVi(a[min], a[i]);}

}

49

Page 50: C2 sap xep

Các phương pháp sắp xếp thông dụng

Phương pháp Đổi chỗ trực tiếp (Interchange sort) Phương pháp Nổi bọt (Bubble sort) Phương pháp Chèn trực tiếp (Insertion sort) Phương pháp Chọn trực tiếp (Selection sort) Phương pháp dựa trên phân hoạch (Quick sort)

50

Chương 2: Sắp xếp

Page 51: C2 sap xep

Quick Sort – Ý tưởng

Ý tưởng: Chia dãy cần sắp thành 2 phần

½ dãy bên trái chứa các giá trị nhỏ hơn ½ dãy bên phải

Thực hiện việc sắp xếp trên từng dãy con

51

Chương 2: Sắp xếp

Page 52: C2 sap xep

Quick Sort – Ví dụ

2 8 5 1 6 4 15

12

1 2 3 4 5 6 70

left right

5X

STOP

Khi >= x

i j

STOP

Khi <= x

Phân hoạch dãy52

Page 53: C2 sap xep

Quick Sort – Ví dụ

2 8 5 1 6 12

15

4

1 2 3 4 5 6 70

left right

5X

STOP

Khi >= x

i j

STOP

Khi<= x

Phân hoạch dãy53

Chương 2: Sắp xếp

Page 54: C2 sap xep

Quick Sort – Ví dụ

2 1 5 8 6 12

15

4

1 2 3 4 5 6 70

left right

ij

54

Chương 2: Sắp xếp

Page 55: C2 sap xep

Quick Sort – Ví dụ

6X

2 4 5 8 6 12

15

1

1 2 3 4 5 6 70

left right

i j

STOP

Khi >= x

STOP

Khi <= x

Sắp xếp đoạn 3

Phân hoạch dãy55

Chương 2: Sắp xếp

Page 56: C2 sap xep

Quick Sort – Ví dụ

2 4 5 6 8 12

15

1

1 2 3 4 5 6 70

left right

ij

Sắp xếp đoạn 3

56

Chương 2: Sắp xếp

Page 57: C2 sap xep

Quick Sort – Ví dụ

2 4 5 6 8 12

15

1

1 2 3 4 5 6 70

57

Chương 2: Sắp xếp

Page 58: C2 sap xep

Quick Sort – Phân hoạch dãy

// input: dãy (a, n)// output: dãy con chia thành 2 đoạn: đoạn 1 ≤ x ≤ đoạn 2 Bước 1: Chọn tùy ý một phần tử x trong dãy giá trị mốc:

x = a[(left+right)/2]; Bước 2: Duyệt từ 2 đầu dãy để phát hiện và hiệu chỉnh cặp phần tử

a[i], a[j] vi phạm điều kiện Bước 2.1: i = left; j = right; Bước 2.2: Trong khi (a[i]<x) i++; Bước 2.3: Trong khi (a[j]>x) j--; Bước 2.4: Nếu i<= j

Hoán vị (a[i], a[j]); i++; j--; Bước 2.5: Nếu i < j: Lặp lại Bước 2.2 //chưa xét hết mảng//Hết duyệt

58

Chương 2: Sắp xếp

Page 59: C2 sap xep

Quick Sort – Cài đặt

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

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

i++ ; j--;

}

} while(i < j);

if(left<j) QuickSort(a, left, j);

if(i<right) QuickSort(a, i, right);

}

59