1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo Các thuật toán sắp xếp.PPT

79 1,5K 3

Đ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 79
Dung lượng 431 KB

Nội dung

Ý tưởngChia dãy thành [n/2] nhóm dãy con xen kẽ nhau, sắp thứ tự trên từng nhóm riêng biệt sẽ đưa các phần tử về thứ tự đúng tương đối chỉ đúng so với các phần tử trong nhóm, có thể chưa

Trang 2

Nội dung báo cáo

• Các thuật toán sắp xếp nội:

Trang 4

Ý tưởng

Chia dãy thành [n/2] nhóm (dãy con) xen kẽ nhau, sắp thứ tự trên từng nhóm riêng biệt sẽ đưa các phần tử về thứ tự đúng tương đối (chỉ đúng so với các phần tử trong nhóm, có thể chưa đúng với dãy ban đầu)

Sau đó chia thành [n/2]-2 nhóm xen kẽ, sắp thứ tự trên từng nhóm …

Làm như trên cho đến khi còn 3 nhóm hoặc 2

nhóm thì chia tiếp thành 1 nhóm

Sắp xếp thứ tự trên nhóm cuối cùng sẽ cho ta kết quả

Trang 5

Ví dụ

0 1 2 3 4 5

a[0]=5; a[1]=4; a[2]=9; a[3]=6; a[4]=9; a[5]=7;

Trang 12

Ví dụ

0 1 2 3 4 5

Trang 20

Ví dụ

0 1 2 3 4 5

Dãy đã sắp xếp xong

Trang 21

• B10: Lặp lại B4,5,6,7,8,9 đến khi i=N-1;

• B11: Tăng step 1 đơn vị

• B12: Lặp lại B2,3,4,5,6,7,8,9,10 đến khi

step=[n/2]-1

Trang 22

Chương trìnhvoid ShellSort(int a[], int N, int h[], int k)

{ int step, i,j,x,len;

Trang 24

Heap sort

Định nghĩa lô (Heap):

Dãy a[0], a[1], a[2],…., a[n-1] được gọi

là một lô nếu thỏa mãn điều kiện sau :

a[k]>=a[i] với k=(i-1)/2 và 0<=k<i<n

Và khi đó ta nhận thấy rằng :

+ a[0] = max { a[0], a[1],…, a[n-1] }

+ a[j], a[j+1],…, a[n-1] là một lô

với j=(n-1)/2+1

Trang 25

Ý tưởng

+ Sắp xếp sao cho mảng a[0], a[1], …., a[n-1] là một lô Khi đó a[0] là phần tử lớn nhất của mảng

+ Hoán vị a[0] và a[n-1]

+ Lặp lại hai bước này với mảng mới là ( a[0], a[1],…., a[n-2] ), …

+ Cứ tiếp tục cho đến hết mảng

Trang 26

Ví dụ

0 1 2 3 4 5

Trang 27

Ví dụ

0 1 2 3 4 5

l=2 r=5i=2 j=2*i+1=5 x=a[2]=7

a[5]=6<x

Trang 29

Ví dụ

0 1 2 3 4 5

l=1 r=5i=4 j=9 >r

Trang 30

Ví dụ

0 1 2 3 4 5

l=0 r=5i=0 j=1 x=13

a[1]=31, a[2]=7 j=1, a[1]>x

Trang 31

Ví dụ

0 1 2 3 4 5

l=0 r=5i=1 j=3 x=13

a[3]=11,a[4]=22 j=4, a[4]>x

Trang 32

Ví dụ

0 1 2 3 4 5

l=0 r=5i=4 j=9>r

Trang 33

Ví dụ

0 1 2 3 4 5

l= -1 r=5/* Tạo Heap xong */

/* Hoán vị a[0] với a[r] */

Trang 34

Ví dụ

0 1 2 3 4 5

Trang 38

/* Tạo xong Heap */

/* Hoán vị a[0] với a[r] */

Trang 39

Ví dụ

0 1 2 3 4 5

Trang 41

Ví dụ

0 1 2 3 4 5

l= -1 r=3

/* Tạo Heap xong */

/* Hoán vị a[0] với a[r] */

Trang 42

Ví dụ

0 1 2 3 4 5

Trang 44

Ví dụ

0 1 2 3 4 5

l=0 r=2

/* Tạo Heap xong */

/* Hoán vị a[0] với a[r] */

Trang 45

Ví dụ

0 1 2 3 4 5

Trang 47

Ví dụ

0 1 2 3 4 5

l= -1 r=1

/* Tạo Heap xong */

/* Hoán vị a[0] với a[r] */

Trang 48

Ví dụ

0 1 2 3 4 5

r=0

Trang 49

Ví dụ

0 1 2 3 4 5

/*Kết thúc*/

Trang 50

Thuật toán Heap sort

• Bước 1: Cho r = n-1.

• Bước 2: Cho l = (n-1)/2.

• Bước 3: Thêm a[l] vào lô a[l+1], a[l+2], , a[r] để tạo thành lô a[l], a[l+1],…,a[r]

+ Bước 3.1: Cho i=l, j=2*i +1, x=a[i]

+ Bước 3.2: Nếu j<r và a[j] < a[j+1] thì tăng j

Trang 51

+ Bước 3.4: Ngược lại thì:

+ Hoán vị a[i] và a[j]

+ Cho i=j

+ Bước 3.5: Lặp lại B3.2, B3.3, B3.4 đến khi j>r

• Bước 4: Giảm l.

Trang 52

• Bước 5: Lặp lại B3,B4 đến khi l<0.

• Bước 6: Hoán vị a[0] và a[r].

• Bước 7: Giảm r.

• Bước 8: Cho l=0.

• Bước 9: Làm B3.

• Bước 10: Lặp lại B6,B7 cho đến khi r=0.

• Bước 11: Xuất kết quả.

Trang 54

Void Heapsort ( int a[], int n)

Trang 55

Void CreateHeap ( int a[], int n)

Trang 56

Void Shift ( int a[], int l, int r )

Trang 58

Merge Sort

Để sắp xếp dãy a[0], a[1],….,a[n-1]

giải thuật Merge Sort dựa trên nhận xét

sau:

+Mỗi dãy bất kì đều có thể xem là tập hợp các dãy con liên tiếp mà mỗi dãy con đều có thứ tự VD: dãy (12,3,5,6,1) có thể xem là 3 dãy con (12), (3,5,6), (1)

+Dãy có thứ tự xem như là một

dãy con

Trang 59

Ý tưởng

nguyên tắc phân phối đều luân phiên.

một dãy con của dãy ban đầu, ta nhân được dãy ban đầu với số lượng dãy con giảm đi

một nửa.

ban đầu nhưng chỉ có một dãy con.

Trang 60

12 2 8 5 1 6 4 15

Trang 66

1 2 4 5 6 8 12 15

Trang 67

Thuật toán

dãy b,c theo nguyên tắc luân phiên từng nhóm k phần tử:

vào a theo nguyên tắc phần tử nhỏ xếp trước

dừng.

Trang 69

Void Merge sort()

{ int p,pb,pc; int i,k=1;

do { p=pb=pc=0;

while (p<n) { for (i=0;(p<n)&&(i<k);i++)

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

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

Merge(a,pb,pc,k);

k*=2;

} while ( k<n );

}

Trang 70

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

{ int p, pb, pc, ib, ic, kb, kc;

Trang 71

}

}

}

Trang 73

Giới thiệu

Các giải thuật sắp thứ tự mảng nói trên đươc thực hiện với giả thiết mảng có kích thước đủ nhỏ để được nạp toàn bộ vào bộ nhớ Nhưng nếu tập tin chứa nhiều mẫu tin và mỗi

mẫu tin có chiều dài tương đối lớn thì

ta không thể nạp toàn bộ tập tin vào

bộ nhớ chính để sắp thứ tự.

Trang 74

Ý tưởng

• Ta phân chia tập tin cần sắp xếp thành các tập tin nhỏ hơn có số lượng mẫu tin mà bộ nhớ chính có thể chứa chúng

• Sau đó nạp chúng vào bộ nhớ chính rồi

dùng phương pháp sắp thứ tự nội để sắp xếp chúng lại thành các mạch (run)

• Trộn các mạch (run) lại và đưa vào tập tin cần sắp xếp

• Thực hiện như vậy cho đến khi tập tin

được sắp xếp xong

Trang 75

Sắp xếp trên tập tin theo kiểu trộn

tự nhiên (Natural Merge-Sort)

• B5:Thực hiện lại các bước trên cho đến khi nào

F đã có thứ tự.

Trang 76

F2: 2 0 9 4 18 1 4

Trang 77

F2: 0 1 1 7 9 16 0 1 4 6 9 14

Trang 78

F2:0 1 4 4 6 9 11 14 18

Ngày đăng: 04/04/2015, 15:12

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w