Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 56 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
56
Dung lượng
315,52 KB
Nội dung
SẮP XẾP Đỗ Thanh Nghị dtnghi@cit.ctu.edu.vn NỘI DUNG • GIẢI THUẬT SẮP XẾP ĐƠN GIẢN – bubble sort, selection sort, insertion sort • GIẢI THUẬT SẮP XẾP NHANH – quick sort, heap sort, bin sort GIỚI THIỆU • TẠI SAO CẦN SẮP XẾP – Sắp xếp danh sách đối tượng theo thứ tự tốn có ý nghĩa thực tiễn – Sắp xếp yêu cầu thiếu thiết kế phần mềm ứng dụng – Nghiên cứu phương pháp xếp cần thiết GIỚI THIỆU • KHÁI NIỆM – Sắp xếp xếp liệu tổ chức nhớ máy tính – Các đối tượng cần xếp mẩu tin gồm nhiều trường Một trường gọi khóa (key), kiểu kiểu có quan hệ thứ tự (như kiểu số nguyên, số thực, chuỗi ký tự) – Danh sách đối tượng cần xếp mảng mẩu tin vừa nói GIỚI THIỆU • KHÁI NIỆM – Mục đích việc xếp tổ chức lại mẩu tin cho khóa chúng thứ tự tương ứng với quy luật xếp – Sắp xếp xếp sử dụng số lượng đối tượng cần xếp lớn lưu trữ nhớ mà phải lưu trữ nhớ ngồi GIỚI THIỆU • ĐỊNH NGHĨA VÀ KHAI BÁO TRONG CÁC VÍ DỤ MINH HỌA #define N 10000 typedef int keytype; typedef float othertype; typedef struct { keytype key; othertype others; } recordtype; GIỚI THIỆU • HÀM HỐN VỊ TRONG CÁC VÍ DỤ MINH HỌA: O(1) void swap(recordtype *x, recordtype *y) { recordtype temp; temp = *x; *x = *y; *y = temp; } Bubble sort Khóa a[0] a[1] a[2] a[3] a[4] A[5] a[6] a[7] a[8] a[9] Ban đầu 2 10 12 10 Bước 10 12 10 9 10 12 10 9 10 12 10 9 10 10 12 9 10 10 12 9 10 10 12 10 10 12 10 10 12 10 12 10 12 Bước Bước Bước Bước Bước Bước Bước Bước Bước Kết 2 9 10 Bubble sort • GIẢI THUẬT – Bước 1: Xét phần tử a[j] (j từ n-1 đến 1), khố a[j] nhỏ khố a[j-1] hốn vị a[j] a[j-1] Sau bước a[0] có khố nhỏ – Bước 2: Xét phần tử a[j] (j từ n-1 đến 2), khoá a[j] nhỏ khố a[j-1] hốn vị a[j] a[j-1] Sau bước a[1] có khố nhỏ thứ –… – Sau n-1 bước kết thúc Bubble sort void bubble_sort(recordtype a[], int n) { int i,j; for(i= 0; i=i+1; j ) if (a[j].key < a[j-1].key) swap(&a[j],&a[j-1]); } 10 Quick sort Chỉ số Khoá 5 12 10 15 8 10 15 12 Chốt p = 5 12 Chốt p = 2 Chốt p = Chốt p = Chốt p = 12 xong xong 8 10 Chốt p = 10 8 xong 10 xong 15 12 12 15 Chốt p = 15 12 15 xong xong xong xong 42 Quick sort int find_pivot(recordtype a[], int i, int j) { int k = i+1; keytype firstkey = a[i].key; while ((k j) return -1; else if (a[k].key>firstkey) return k; else return i; } 43 Quick sort int partition(recordtype int L,R; a[], int i, int j, keytype pivot) { L = i; R = j; while (L = pivot) R ; if (L=2; i ) { /* */ /* */ /* */ swap(&a[0],&a[i]); /* */ pushdown(a, 0, i-1); /* */ } swap(&a[0],&a[1]); } 55 Heap sort • ĐỘ PHỨC TẠP – Độ phức tạp push_down(a[], 0, n-1): O(logn) – Tạo heap (1-2): O(nlogn) – Vòng lặp cắt tạo heap (3-5), lặp n-2 lần, lần lấy O(logn): O(nlogn) 56