Bài giảng Cấu trúc dữ liệu và giải thuật: Sắp xếp

26 9 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Sắp xế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

Trong chương này các bạn sẽ tìm hiểu một số bài toán sắp xếp và một số thuật toán sắp xếp như: Sắp xếp chèn – insertion sort, sắp xếp lựa chọn – selection sort, sắp xếp nổi bọt – bubble sort, sắp xếp shell-sort, sắp xếp trộn – merge sort, sắp xếp nhanh – quick sort, sắp xếp vun đống – heap sort. Mời các bạn cùng tham khảo.

3/29/2011 Nội dung Chương Sắp xếp  Bài toán xếp  Một số thuật toán xếp  Sắp xếp chèn – insertion sort  Sắp xếp lựa chọn – selection sort  Sắp xếp bọt – bubble sort hiepnd@it-hut.edu.vn  Sắp xếp shell-sort  Sắp xếp trộn – merge sort  Sắp xếp nhanh – quick sort  Sắp xếp vun đống – heap sort Bài tốn xếp Bài tốn xếp  Để tìm kiếm thông tin hiệu ta phải lưu giữ chúng theo thứ tự  Mỗi ghi có khóa (key), ta áp dụng phép so sánh < , > , =, ==, != khóa  Cách xếp sách thư viện  Lưu trữ từ từ điển  Sắp xếp toán quan trọng xử lý thơng tin  Nhiều thuật tốn đề xuất  Ta xét toán xếp trong, khơng xét xếp ngồi  Sắp xếp ghi cách xếp khóa tương ứng chúng struct node { long masoSV;    char hoten[30]; char diachi[50]; float diemTB;         }; 3/29/2011 Các phương pháp xếp Sắp xếp chèn •Sắp xếp chèn •Sắp xếp chèn •Sắp xếp lựa chọn •Cài đặt mảng •Sắp xếp bọt •Cài đặt danh sách moc nối •Sắp xếp shellsort •Phân tích •Bài tập Sắp xếp chèn Sắp xếp chèn  Sắp xếp cách chèn:  Bắt đầu danh sách có thứ tự rỗng  Lần lượt chèn thêm phần tử cần xếp vào danh sách có thứ tự (Trong trình chèn phải đảm bảo danh sách thứ tự)  Chèn phần tử vào danh sách có thứ tự  Kết thúc ta thu danh sách phần tử xếp theo thứ tự VD Danh sách vật theo thứ tự bảng chữ 3/29/2011 Sắp xếp chèn Sắp xếp chèn  Các phần tử cần xếp: hen, cow, cat, ram, ewe, dog  Danh sách lưu trữ mảng hen cow hen cat cow hen Thêm hen Thêm cow Thêm cat cat cow hen ram Thêm ram cat cow ewe hen ram Thêm ewe cat cow cat cow dog ewe hen dog ewe hen ram ram Thêm dog Sắp xếp chèn MAX-1 …… Đã xắp xếp Còn trống Chỉ số phần tử cuối (end) Sắp xếp chèn  Lưu trữ mảng: void insert (int A[], int &end, int value) { if(end==‐1) { end++; A[end]=value;        } else { int pos=0, i; while(A[pos]=pos; i‐‐) A[i+1]=A[i]; A[pos]=value; end=end+1; }    }  Hàm xếp chèn, phần tử cần xếp lưu mảng B, kết lưu mảng A, n số phần tử void insertionSort(const int B[], int n, int A[]) { int end=‐1; for(int i=0; imasoSV=msSV; strcpy(ptr‐>hoten,ht); strcpy(ptr‐>diachi,dc); ptr‐>diemTB = diem; if(pHead==NULL)  { ptr‐>pNext=NULL; pHead=ptr;             } else { if(pHead‐>masoSV >= msSV) { ptr‐>pNext=pHead; pHead=ptr;             }        else {  NODE *preQ=pHead; NODE *q=pHead‐>pNext; while(q!=NULL && q‐>masoSV pNext; } ptr‐>pNext=q; preQ‐>pNext=ptr;     } } } 3/29/2011 Phân tích Phân tích  Thời gian thực thuật tốn chèn tổng thời gian thực phép chèn vào danh sách có thứ tự Trong trường hợp cài đặt mảng:  Số lệnh phép so sánh thực :  Trong trường hợp cài đặt mảng:  Danh sách rỗng cần so sánh + phép gán  Tại thời điểm danh sách có end (0≤i0 phần tử) vịng lặp while thực j lần (1≤j≤k)  trung bình k/2  Giá trị k từ đến n-1 (số lượng phần tử) Vậy  Khi áp dụng danh sách móc nối khơng phải thực dịch chuyển phần tử mà thay đổi giá trị vài trỏ  Sắp xếp chèn hiệu thực danh sách móc nối ! j n(n  1)  O(1)   O(n ) j 1 n 1 T (n)  O(1)   3/29/2011 Bài tập  Bài tập 1: Trường hợp tồi thuật toán xếp chèn (số lượng phép so sánh phải thực lớn nhất) Và trường hợp tốt Sắp xếp lựa chọn  Bài tập 2: Minh họa bước thuật toán xếp chèn dãy sau theo thứ tự tăng dần: a) 26 33 35 29 19 12 22 b) 12 19 33 26 29 35 22 •Sắp xếp lựa chọn c) 12 14 36 41 60 81 •Cài đặt d) 81 60 41 36 14 12 •Phân tích e) Tim Dot Eva Roy Tom Kim Guy Amy Jon Ann Jim Kay Ron Jan •Bài tập Sắp xếp lựa chọn Sắp xếp lựa chọn  Nhược điểm thuật toán chèn: cần nhiều thao tác di chuyển ghi trường hợp lưu trữ mảng Dãy ban đầu Bước 5 Bước 5 Bước … 5  Kích thước ghi lớn, gồm nhiều trường lưu trữ liên tục  tốc độ thực bị ảnh hưởng lớn  Khắc phục phương pháp xếp lựa chọn Dãy cuối 5 3/29/2011 Sắp xếp lựa chọn  Một phần tử: typedef struct node { char hoten [30]; float diem;     } NODE; Sắp xếp lựa chọn Sắp xếp lựa chọn void SelectionSort(NODE A[], int n) { int i,j; int pos; for(i=n‐1;i>=1;i‐‐) { pos=0; for(j=1;j A[pos].diem) pos=j;   } swap(A,pos,i);            } } Phân tích  Hàm swap  Vịng lặp ngồi với biến chạy i thực n-1 lần void swap(NODE A[], int pos, int i) { char tmp[30]; float d; strcpy(tmp,A[pos].hoten); strcpy(A[pos].hoten,A[i].hoten); strcpy(A[i].hoten,tmp); d=A[pos].diem; A[pos].diem=A[i].diem; A[i].diem=d;  Vòng lặp bên  Lần thứ thực n-1 lần  Lần thứ hai thực n-2 lần  …  Lần thứ i thực n-i lần T (n)  (n  1)  (n  2)    n(n  1)  O(n ) } 3/29/2011 Phân tích Bài tập  Sắp xếp lựa chọn giảm số lần phải dịch chuyển liệu tới mức tối thiểu  Bài tập Minh họa xếp lựa chọn dãy  Cho hiệu tốt áp dụng xếp với cấu trúc liệu lưu trữ liên tiếp nhớ (VD Mảng)  Không hiệu so với xếp chèn thực danh sách móc nối đơn! Tại lại hiệu xếp chèn danh sách móc nối ? a) 26 33 35 29 19 12 22 theo thứ tự tăng b) 12 19 33 26 29 35 22 theo thứ tự giảm c) Tim Dot Eva Roy Tom Kim Guy Amy Jon Ann Jim Kay Ron Jan theo thứ tự tăng bảng chữ  Bài tập viết lại hàm xếp lựa chọn mảng để đếm số lần hoán đổi liệu  Bài tập Áp dụng hàm đếm số lần hoán đổi liệu thực xếp chèn lựa chọn mảng để so sánh hiệu phương pháp với mảng số đầu vào có n phần tử (n=1000) sinh ngẫu nhiên Sắp xếp bọt  Dựa ý tưởng tuyển quặng: "Quặng nặng chìm xuống cịn tạp chất nhẹ lên trên" Sắp xếp bọt •Sắp xếp bọt •Cài đặt  Thực so sánh phần tử nằm kề nhau, chúng không thứ tự ta đổi chỗ chúng cho  phần tử có giá trị khóa lớn bị đẩy cuối khóa nhỏ bị đẩy lên (trong trường hợp xếp tăng dần) •Phân tích •Bài tập 3/29/2011 Sắp xếp bọt Dãy ban đầu lần lặp 3 7 3 2 5 7 Sắp xếp bọt 3 Lần lặp 7 7 7 1 kết thúc lần lặp kết thúc lần lặp Sắp xếp bọt Lần lặp 3 Sắp xếp bọt Lần lặp 7 7 2 5 7 kết thúc lần lặp kết thúc lần lặp 3 1 5 7 Dãy xếp ! 3/29/2011 Sắp xếp bọt void { BubbleSort(int A[], int n) int i,j; for(i=n‐1;i>0;i‐‐) for(j=1;jpNext; while(end‐>pNext!=NULL && end‐>pNext‐>pNext!=NULL) { start = start‐>pNext; end = end‐>pNext‐>pNext;                       } second = start‐>pNext; start‐>pNext=NULL;  } NODE *p=first; NODE *q=second; while(p!=NULL && q!=NULL) { if(p‐>data data) { ptr‐>pNext=p; p=p‐>pNext; ptr=ptr‐>pNext; ptr‐>pNext=NULL;                 }  14 3/29/2011 Sắp xếp trộn else { ptr‐>pNext=q; q=q‐>pNext; ptr=ptr‐>pNext; ptr‐>pNext=NULL;  }          } if(p==NULL) ptr‐>pNext=q; else ptr‐>pNext=p; ptr=third; third=third‐>pNext; free(ptr); } Sắp xếp trộn Sắp xếp trộn void MergeSort(NODE *&pHead) { if(pHead!=NULL && pHead‐>pNext!=NULL) { NODE *second=NULL;           split(pHead,second); MergeSort(pHead); MergeSort(second); NODE *third=NULL; merge(pHead,second,third); pHead=third;           }  } Sắp xếp trộn  Phân tích thao tác chia:  Mỗi lần chia đôi ta phải duyệt hết danh sách  Danh sách ban đầu có n phần tử cần thực n lần duyệt  Lần chia thứ danh sách chia thành danh sách n/2 phần tử Mỗi danh sách chia nhỏ ta phải duyệt n/2 lần  tổng n/2+ n/2 =n lần  …  Tổng cộng lần chia phải thực n thao tác duyệt, mà có logn lần chia độ phức tạp thao tác chia O(nlogn) 15 3/29/2011 Sắp xếp trộn  Phân tích: thao tác kết hợp  Đánh giá thời gian thực thuật tốn thơng qua số lượng phép so sánh  Tại mức số lượng phép so sánh tối đa vượt số lượng phần tử danh sách mức Sắp xếp trộn  Độ phức tạp tính tốn trung bình xếp trộn O(nlogn)  Trong trường hợp cài đặt với danh sách liên tục (VD Mảng) ta gặp vấn đề khó khăn với thao tác kết hợp là:  Phải sử dụng thêm nhớ phụ (dùng mảng phụ để tránh phải dịch chuyển phần tử)  Mức nhỏ logn có n danh sách con, để kết hợp thành n/2 danh sách cần n nhiều phép so sánh  Nếu khơng sử dụng nhớ phụ thời gian thực O(n2) – chi phí cho việc dịch phần tử mảng  …  Chương trình viết phức tạp so với dùng danh sách móc nối  Tổng cộng mức phải thực nhiều n phép so sánh, mà có logn mức nên thời gian thực thao tác kết hợp cỡ O(nlogn) Bài tập  Bài tập Minh họa MergeSort (vẽ đệ quy) cho danh sách sau a) Tim Dot Eva Roy Tom Kim Guy Amy Jon Ann Jim Kay Ron Jan Sắp xếp nhanh – QuickSort (C A R Hoare 1962) b) 32, 95, 16, 82, 24, 66, 35, 19, 75, 54, 40, 43, 93, 68  Bài tập Cài đặt MergerSort cho trường hợp xếp mảng Gợi ý: sử dụng thêm danh sách phụ để lưu trữ •Sắp xếp nhanh •Cài đặt •Phân tích •Bài tập 16 3/29/2011 Sắp xếp nhanh Sắp xếp nhanh  Ý tưởng: giống xếp trộn chia danh sách thành phần, nhiên xếp nhanh ý tưởng chia khác chút  Một phần tử danh sách chọn làm phần tử ‘chốt’ (thường phần tử đầu danh sách)  Danh sách sau chia thành phần, phần đầu gồm phần tử nhỏ chốt, phần lại phần tử lớn chốt  Sau hai danh sách lại chọn chốt chia tiếp danh sách có phần tử  Cuối ta kết hợp danh sách phần tử chốt mức lại ta danh sách xếp 35 29 24 22 25 23 35 29 24 22 25 23 35 29 24 22 25 23 22 29 24 35 25 23 22 29 24 35 Chọn chốt 26, dãy chia làm phần Chia tiếp dãy Kết hợp dãy khóa 26 33 12 26 12 26 35 29 22 22 12 22 22 33 35 33 22 26 12 29 29 29 33 33 29 35 35 35 Sắp xếp nhanh  Sắp xếp nhanh mảng: Cách chia danh sách với phần tử chốt 23 26 12 Sắp xếp nhanh 25 Dãy ban đầu 25 23 22 24 29 35 25 23 22 24 29 35 24 23 22 25 29 35 24 23 22 25 29 void qSort(int A[], int start, int end) { //chon phan tu dau lam chot if(start

Ngày đăng: 21/05/2021, 14:06

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan