SlideShare a Scribd company logo
1 of 9
Download to read offline
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
Trang1
CÁC THUẬT TOÁN SẮP XẾP
M C TIÊU
Hoàn tất bài thực hành này, sinh viên có thể:
- Hiểu được các thuật toán sắp xếp: Selection Sort, Heap Sort, Quick Sort, Merge Sort.
- Áp dụng các thuật toán sắp xếp để giải quyết các bài toán sắp xếp đơn giản.
- Áp dụng các thuật toán sắp xếp để giải quyết các bài toán sắp xếp trên danh sách các cấu
trúc theo từng khóa.
- So sánh, đánh giá thời gian chạy của thuật toán với số lượng phần tử lớn.
Thời gian thực hành: từ 120 phút đến 400 phút
TÓM T T
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ữ tại mỗi phần tử.
Mức độ hiệu quả của từng giải thuật phụ thuộc vào tính chất của cấu trúc dữ liệu cụ thể mà nó tác
động đến.
Có nhiều giải thuật sắp xếp: Selection sort, Insertion sort, Interchange sort, Bubble sort, Shaker
sort, Binary Insertion sort, Shell sort, Heap sort, Quick sort, Merge sort, Radix sort…
Selection sort
• 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ử.
Heap sort
Heap là một dãy các phần tử aleft, aleft+1,... , aright sao cho: ai ≥ a2i và ai ≥ a2i+1, ∀i ∈ [left, right].
(ai , a2i), (ai ,a2i+1): các cặp phần tử liên đới.
Heap được định nghĩa như trên được dùng trong trường hợp sắp xếp tăng dần, khi sắp xếp giảm dần
phải đổi chiều các quan hệ.
Ví dụ 1: Dãy số 5 2 6 4 8 1 được bố trí theo quan hệ so sánh và tạo thành cấu trúc như sau:
Phần tử ở mức i chính là phần tử lớn trong cặp phần tử tương ứng ở mức i+1
Ví dụ 2: Loại bỏ 8 ra khỏi cây.
Tài li u hư ng d n th c hành môn
Tiến hành nhiều lần việc loại bỏ phầ
∞, khi đó xếp các phần tử theo thứ tự
Quick sort
Phân chia dãy thành các đoạn con như sau:
• Đoạn thứ 2 đã có thứ tự.
• Nếu các đoạn 1 và 3 chỉ có 1 ph
đã được sắp.
• Ngược lại, nếu các đoạn 1 và 3 có nhi
khi các đoạn 1, 3 được sắp.
• Để sắp xếp các đoạn 1 và 3, ta l
phương pháp phân hoạch dãy ban
Với x là một phần tử tùy ý trong dãy và
Merge sort
• Phân hoạch dãy ban đầu thành các dãy con
• Làm giảm số dãy con bằng cách tr
của dãy ban đầu.
N I DUNG TH C HÀNH
Cơ bản
Sinh viên đọc kỹ phát biểu bài tập và th
Sử dụng các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort
số nguyên theo thứ tự tăng dần.
Người dùng sẽ lần lượt nhập chiều dài n và các ph
bộ dãy A được lưu trữ trong một mả
Lần lượt sử dụng các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort
A. Chương trình sẽ in các kết quả sắ
Phân tích
Selection sort
Phân tích
- Dùng vòng lặp để tìm phần t
- Đảo phần tử đó ra đầu mảng
Chương trình mẫu (CacThuatToanSapXep)
c hành môn C u trúc d li u và gi i thu t
ần tử gốc của cây cho đến khi tất cả các phần tử
ự loại bỏ trên cây sẽ có dãy đã sắp xếp.
như sau:
có 1 phần tử thì chúng cũng đã có thứ tự, khi đó d
n 1 và 3 có nhiều hơn 1 phần tử thì dãy con ban đ
n 1 và 3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng
ch dãy ban đầu vừa trình bày …
tùy ý trong dãy và thường được chọn là vị trí chính giữa dãy ban đ
u thành các dãy con liên tiếp mà mỗi dãy con đều đã có th
ng cách trộn từng cặp dãy con của hai dãy phụ thành m
p và thực hiện theo hướng dẫn:
Selection Sort, Heap Sort, Quick Sort, Merge Sort để sắp x
u dài n và các phần tử của dãy các nguyên A từ
ảng số nguyên.
Selection Sort, Heap Sort, Quick Sort, Merge Sort
ắp xếp theo từng thuật toán ra màn hình.
n tử nhỏ nhất trong dãy hiện hành.
(CacThuatToanSapXep)
Trang2
ử của cây đều là -
, khi đó dãy con ban đầu
đầu chỉ có thứ tự
ng dãy con theo cùng
y ban đầu.
ã có thứ tự..
thành một dãy con
p xếp một dãy các
bàn phím. Toàn
Selection Sort, Heap Sort, Quick Sort, Merge Sort để sắp xếp dãy
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang3
#include <stdio.h>
void Swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
void SelectionSort(int a[],int N ){ //Ghi chú: tại sao không sử dụng kí hiệu & trong hàm này?
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++){ //Ghi chu: vòng lặp này dùng để làm gì?
min = i;
for(int j = i+1; j < N ; j++){ //Ghi chu: vòng lặp này dùng để làm gì?
if (a[j] < a[min]){
min = j; //Ghi chu: thao tác này dùng để làm gì?
}
}
if (min != i){
Swap(a[min], a[i]); //Ghi chu: thao tác này dùng để làm gì?
}
}
}
void main()
{
int x[10] = {12, 2, 8, 5, 1, 6, 4, 15}; // khởi tạo các giá trị trong mảng
int n = 8; // số phần tử của mảng
SelectionSort(x, n);
for (int i=0; i<n ; i++){
printf("%d ", x[i]);
}
}
Yêu cầu
1. Biên dịch đoạn chương trình nêu trên.
2. Tại sao trong hàm SelectionSort, vòng lặp thứ nhất có điều kiện là i < N-1?
3. Trả lời các dòng lệnh có yêu cầu ghi chú.
4. Sửa lại chương trình để nhập dãy số nguyên từ file input.txt có nội dung như sau:
5 1 2 3 8 6 23 10
Sau đó dùng thuật toán Selection Sort sắp xếp dãy số nguyên trên tăng dần.
5. Sửa hàm SelectionSort trên để sắp xếp dãy số nguyên ở câu 4 giảm dần.
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang4
Heap Sort
Phân tích
- Hiệu chỉnh dãy số ban đầu về dạng heap được định nghĩa trên mảng (hay list).
- Áp dụng thuật toán Heap Sort trên cấu trúc này.
Chương trình mẫu
void Shift (int a[], int left, int right){
int x, curr, joint;
curr = left; joint =2*curr+1; // a
joint
: Phần tử liên đới
x = a[curr];
while (joint <= right){
if (joint < right){ // Ghi chú: điều kiện này có ý nghĩa gì?
if (a[joint] < a[joint+1]){
joint = joint+1;
}
}
if (a[joint]<x){
break; // Thỏa quan hệ liên đới
}
a[curr] = a[joint];
curr = joint; // Xét khả năng hiệu chỉnh lan truyền
joint = 2*curr+1;
}
a[curr] = x;
}
Yêu cầu
1. Trả lời các dòng lệnh có yêu cầu ghi chú.
2. Cho biết chức năng của đoạn chương trình trên.
3. Viết hàm void CreateHeap(int a[], int N); để chuyển đổi dãy a0, a1, …, aN-1 thành heap.
Gợi ý: Sử dụng hàm Shift bên trên với left hiện hành là phần tử ở giữa dãy ((N-1)/2). Lặp lại
quá trình trên với left giảm dần về đầu dãy.
4. Viết hàm void HeapSort(int a[], int N); để sắp xếp một dãy số nguyên tăng dần.
Gợi ý: Giai đoạn 1: Hiệu chỉnh dãy ban đầu thành heap
Giai đoạn 2: Sắp xếp dãy số dựa trên heap.
• Xét dãy hiện hành là dãy nhập
• Hoán vị phần tử lớn nhất (a0) về vị trí cuối.
• Xét dãy hiện hành loại đã trừ phần tử cuối.
• Hiệu chỉnh lại dãy hiện hành thành heap
• Lặp lại quá trình trên tới hết dãy ban đầu.
5. Bổ sung các hàm trên vào chương trình mẫu (CacThuatToanSapXep) đồng thời thay đổi hàm
main và file input để sắp xếp dãy số nguyên sau tăng dần:
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang5
44 55 12 42 94 18 6 67
6. Viết lại thuật toán Heap Sort để sắp xếp dãy số ở câu 3 giảm dần.
Quick Sort
Phân tích
- Chọn phần tử làm mốc.
- Tiến hành phân hoạch dãy ban đầu thành 3 phần ak<x (1), ak=x (2) và ak>x (3) theo thứ tự.
- Lặp lại thao tác trên trên 2 đoạn (1) và (3)
Chương trình mẫu
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;
while(i < j) {
while(a[i] < x){
i++;
}
while(a[j] > x){
j--;
}
if(i <= j) {
Swap(a[i], a[j]);
i++ ;
j--;
}
}
QuickSort(a, left, j);
QuickSort(a, i, right);
}
Yêu cầu
1. Bổ sung các hàm trên vào chương trình mẫu (CacThuatToanSapXep) đồng thời thay đổi hàm
main và file input để sắp xếp dãy số nguyên sau tăng dần:
42 23 74 11 65 58 94 36 99 87
2. Sửa lại chương trình để đếm số phép gán và số phép so sánh sự dụng trong hàm QuickSort.
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang6
Merge Sort
Phân tích
- Phân phối đều luân phiên các dãy con độ dài k từ mảng a vào hai mảng b và c.
- Trộn mảng b và mảng c vào mảng a.
- Lặp lại quá trình trên với k tăng gấp đôi đến khi k lớn hơn hay bằng chiều dài của dãy.
Chương trình mẫu
int b[MAX], c[MAX], nb, nc; //// Ghi chú: 2 mảng này dùng để làm gì?
void Distribute(int a[], int N, int &nb, int &nc, int k){
int i, pa, pb, pc; //Ghi chú: các biến này có ý nghĩa gì?
pa = pb = pc = 0;
while (pa < N){
for (i=0; (pa<N) && (i<k); i++, pa++, pb++){ //Ghi chú: vòng lặp này có ý nghĩa gì?
b[pb] = a[pa];
}
for (i=0; (pa<N) && (i<k); i++, pa++, pc++){ //Ghi chú: vòng lặp này có ý nghĩa gì?
c[pc] = a[pa];
}
}
nb = pb; nc = pc;
}
void Merge(int a[], int nb, int nc, int k){
int pa, pb, pc;
pa = pb = pc = 0;
while ((pb < nb) && (pc < nc)){
MergeSubarr(a, nb, nc, pa, pb, pc, k);
}
while (pb < nb){
a[pa ++] = b[pb ++]; //Ghi chú: câu lệnh này có ý nghĩa gì?
}
while (pc < nc){
a[pa ++] = c[pc ++]; //Ghi chú: câu lệnh này có ý nghĩa gì?
}
}
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang7
Trong đó hàm MergeSubarr được cài đặt như sau:
void MergeSubarr(int a[], int nb, int nc, int &pa, int &pb, int &pc, int k){
int rb, rc;
rb = min(nb, pb+k);
rc = min(nc, pb+k);
while ((pb < rb) && (pc < rc)){
if (b[pb] < c[pc])
a[pa ++] = b[pb ++];
else a[pa ++] = c[pc ++];
}
while (pb < rb){
a[pa ++] = b[pb ++];
}
while (pc < rc){
a[pa ++] = c[pc ++];
}
}
Yêu cầu
1. Trả lời các dòng lệnh có yêu cầu ghi chú.
2. Cho biết chức năng của từng hàm trên.
3. Bổ sung các hàm cần thiết vào chương trình mẫu (CacThuatToanSapXep) và viết hàm void
MergeSort(int a[], int N); để sắp xếp dãy số nguyên sau tăng dần.
5 2 9 3 7 2 4 11
Gợi ý: Xem lại 2 thao tác đã nêu bên trên.
4. Sửa lại chương trình để sắp xếp dãy số trên giảm dần.
Áp dụng – Nâng cao
Cho dãy số nguyên A như sau:
12 2 15 -3 8 5 1 -8 6 0 4 15
1. Sắp xếp dãy trên tăng dần.
2. Suy ra số lớn thứ 3 trong dãy.
3. Suy ra số lượng phần tử lớn nhất trong dãy.
4. Sắp xếp dãy trên theo thứ tự giá trị tuyệt đối tăng dần.
5. Sắp xếp dãy trên theo quy luật sau:
• các số dương (nếu có) ở đầu mảng và có thứ tự giảm dần,
• các số âm (nếu có) ở cuối mảng và có thứ tự tăng dần.
6. Sắp xếp dãy trên theo quy luật:
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang8
• các số chẵn (nếu có) ở đầu mảng và có thứ tự tăng dần,
• các số lẻ (nếu có) ở cuối mảng và có thứ tự giảm dần.
Cho một danh sách gồm các sinh viên sau:
STT MSSV Họ và tên Năm sinh
1 1005 Trần Minh Thành 1991
2 1001 Trần Thị Bích 1988
3 1003 Trần Minh Thành 1990
4 1000 Võ Quang Vinh 1990
5 1008 Nguyễn Văn An 1990
7. Tạo một cấu trúc dữ liệu để xử lý danh sách trên.
8. Sắp xếp danh sách tăng dần theo mã số tăng dần.
9. Sắp xếp danh sách tăng dần theo tên (thứ tự bảng chữ cái) và năm sinh (nếu trùng tên thì sắp theo
năm sinh tăng dần).
BÀI T P THÊM
1. Viết chương trình so sánh các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort về
các mặt sau:
• Thời gian chạy.
• Số phép gán.
• Số phép so sánh.
Gợi ý: Dùng mẫu chương trình sau để tính thời gian chạy một đoạn lệnh
#include <time.h>
…
clock_t start, finish;
start = clock();
//ðo n chương trình c n tính th i gian th c thi
finish = clock();
clock_t duration = finish - start; //Th i gian th c thi
…
2. Trong thuật toán QuickSort, nếu lấy x là phần tử dầu dãy, hãy viết chương trình và so sánh thời
gian chạy thuật toán với khi lấy x là phần tử chính giữa dãy.
3. Sắp xếp dãy trên theo quy luật:
• các số chẵn (nếu có) có thứ tự tăng dần,
• các số lẻ (nếu có) có thứ tự giảm dần
• tính chất chẵn/lẻ tại mỗi vị trí trong dãy A không thay đổi sau khi sắp xếp (tức là trước khi
sắp xếp, tại vị trí i của dãy A là số chẵn/lẻ thì tại vị trí i của mảng sau khi sắp xếp cũng là số
chẵn/lẻ)
Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t
HCMUS 2010
Trang9
Ví dụ: A = (1, 1, 2, 3, 4, 5, 6, 7)
Kết quả kq = (1, 1, 6, 3, 4, 5, 2, 7).
4. Viết lại các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort.với cấu trúc dữ liệu
dạng danh sách liên kết đơn.
5.Tìm hiểu và cài đặt thuật toán Insertion Sort.
6. Tìm hiểu và cài đặt thuật toán Binary Insertion Sort.
7. Tìm hiểu và cài đặt thuật toán Interchange Sort.
8. Tìm hiểu và cài đặt thuật toán Bubble Sort.
9. Tìm hiểu và cài đặt thuật toán Shaker Sort.
10. Tìm hiểu và cài đặt thuật toán Shell Sort.
11. Tìm hiểu và cài đặt thuật toán Radix Sort lần lượt trên 2 loại cấu trúc dữ liệu dạng mảng và dạng
danh sách liên kết. So sánh và rút ra nhận xét.

More Related Content

What's hot

Tính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabTính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabChien Dang
 
Tính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionTính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionChien Dang
 
Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Vu Tuan
 
Bài tập CTDL và GT 3
Bài tập CTDL và GT 3Bài tập CTDL và GT 3
Bài tập CTDL và GT 3Hồ Lợi
 
Thuchanh Ktdk-matlab
Thuchanh Ktdk-matlabThuchanh Ktdk-matlab
Thuchanh Ktdk-matlabmark
 
4 matlab ly-thuyet_dohoa_
4 matlab ly-thuyet_dohoa_4 matlab ly-thuyet_dohoa_
4 matlab ly-thuyet_dohoa_Phi Phi
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNguest717ec2
 
Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xepquang
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Nguyễn Công Hoàng
 
Lttt matlab chuong 1
Lttt matlab chuong 1Lttt matlab chuong 1
Lttt matlab chuong 1Hoa Cỏ May
 
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dong
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dongKhao sat-ung-dung-matlab-trong-dieu-khien-tu-dong
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dongKhoa Pham
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Nguyễn Công Hoàng
 
Matlab cho sv_tbd-dt_8-2007
Matlab cho sv_tbd-dt_8-2007Matlab cho sv_tbd-dt_8-2007
Matlab cho sv_tbd-dt_8-2007Xuantham Nguyen
 
Chap4 new (tran dai's conflicted copy 2013 04-02)
Chap4 new (tran dai's conflicted copy 2013 04-02)Chap4 new (tran dai's conflicted copy 2013 04-02)
Chap4 new (tran dai's conflicted copy 2013 04-02)Loc Tran
 

What's hot (18)

Tính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn MatlabTính toán khoa học - Chương 1: Nhập môn Matlab
Tính toán khoa học - Chương 1: Nhập môn Matlab
 
Tính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: IntroductionTính toán khoa học - Chương 0: Introduction
Tính toán khoa học - Chương 0: Introduction
 
Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731Lap trinh matlab_co_ban_1731
Lap trinh matlab_co_ban_1731
 
Bài tập CTDL và GT 3
Bài tập CTDL và GT 3Bài tập CTDL và GT 3
Bài tập CTDL và GT 3
 
Thuchanh Ktdk-matlab
Thuchanh Ktdk-matlabThuchanh Ktdk-matlab
Thuchanh Ktdk-matlab
 
4 matlab ly-thuyet_dohoa_
4 matlab ly-thuyet_dohoa_4 matlab ly-thuyet_dohoa_
4 matlab ly-thuyet_dohoa_
 
Chuong1
Chuong1Chuong1
Chuong1
 
ThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáNThiếT Kế Và đáNh Giá ThuậT ToáN
ThiếT Kế Và đáNh Giá ThuậT ToáN
 
Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
 
Lttt matlab chuong 1
Lttt matlab chuong 1Lttt matlab chuong 1
Lttt matlab chuong 1
 
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dong
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dongKhao sat-ung-dung-matlab-trong-dieu-khien-tu-dong
Khao sat-ung-dung-matlab-trong-dieu-khien-tu-dong
 
Timkiem&sapxep
Timkiem&sapxepTimkiem&sapxep
Timkiem&sapxep
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
 
Cac lenh trong matlab
Cac lenh trong matlabCac lenh trong matlab
Cac lenh trong matlab
 
Matlab cho sv_tbd-dt_8-2007
Matlab cho sv_tbd-dt_8-2007Matlab cho sv_tbd-dt_8-2007
Matlab cho sv_tbd-dt_8-2007
 
Chap4 new (tran dai's conflicted copy 2013 04-02)
Chap4 new (tran dai's conflicted copy 2013 04-02)Chap4 new (tran dai's conflicted copy 2013 04-02)
Chap4 new (tran dai's conflicted copy 2013 04-02)
 
Chap4 new
Chap4 newChap4 new
Chap4 new
 

Viewers also liked

Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTMasterCode.vn
 
C2 sap xep
C2 sap xepC2 sap xep
C2 sap xephiep0109
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiemp0nZkEn
 
Giao trinh giai thuat
Giao trinh giai thuatGiao trinh giai thuat
Giao trinh giai thuatveaglet
 
Bai giang thuat toan tim kiem va sap xep
Bai giang thuat toan tim kiem va sap xepBai giang thuat toan tim kiem va sap xep
Bai giang thuat toan tim kiem va sap xeptran0phu
 
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTrần Nguyên
 
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPTBài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPTMasterCode.vn
 
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTBài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTMasterCode.vn
 
Quick Sort , Merge Sort , Heap Sort
Quick Sort , Merge Sort ,  Heap SortQuick Sort , Merge Sort ,  Heap Sort
Quick Sort , Merge Sort , Heap SortMohammed Hussein
 

Viewers also liked (9)

Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
 
C2 sap xep
C2 sap xepC2 sap xep
C2 sap xep
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
 
Giao trinh giai thuat
Giao trinh giai thuatGiao trinh giai thuat
Giao trinh giai thuat
 
Bai giang thuat toan tim kiem va sap xep
Bai giang thuat toan tim kiem va sap xepBai giang thuat toan tim kiem va sap xep
Bai giang thuat toan tim kiem va sap xep
 
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
 
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPTBài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
 
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPTBài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
 
Quick Sort , Merge Sort , Heap Sort
Quick Sort , Merge Sort ,  Heap SortQuick Sort , Merge Sort ,  Heap Sort
Quick Sort , Merge Sort , Heap Sort
 

Similar to Ctdl lab07-cac thuat-toan_sap_xep

Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Võ Tâm Long
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfHngTrn365275
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfnguyenkaka2
 
Tìm kiếm và sắp nội
Tìm kiếm và sắp nộiTìm kiếm và sắp nội
Tìm kiếm và sắp nộikikihoho
 
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615clbinternet.info
 
CTDL-04-Ngan xep va Hang doi (1).pdf
CTDL-04-Ngan xep va Hang doi (1).pdfCTDL-04-Ngan xep va Hang doi (1).pdf
CTDL-04-Ngan xep va Hang doi (1).pdfLmTrn286060
 
02 stack queue
02 stack queue02 stack queue
02 stack queuelanheo04
 
Huong dan 8 o so
Huong dan 8 o soHuong dan 8 o so
Huong dan 8 o soshjdunglv
 
Cẩm nang kết cấu xây dựng
Cẩm nang kết cấu xây dựngCẩm nang kết cấu xây dựng
Cẩm nang kết cấu xây dựngAn Nam Education
 
Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Hồ Lợi
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiemgaconne1985
 
Cac van de co so kh may tinh
Cac van de co so kh may tinhCac van de co so kh may tinh
Cac van de co so kh may tinhTunAnh346
 

Similar to Ctdl lab07-cac thuat-toan_sap_xep (20)

Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)Bài 11 Kiểu mảng(tt)
Bài 11 Kiểu mảng(tt)
 
Thuat Toan 2
Thuat Toan 2Thuat Toan 2
Thuat Toan 2
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
matlab co ban
matlab co banmatlab co ban
matlab co ban
 
Tìm kiếm và sắp nội
Tìm kiếm và sắp nộiTìm kiếm và sắp nội
Tìm kiếm và sắp nội
 
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615
CLB Internet - iShare: Ky nang Excel cho moi nguoi - 240615
 
CTDL-04-Ngan xep va Hang doi (1).pdf
CTDL-04-Ngan xep va Hang doi (1).pdfCTDL-04-Ngan xep va Hang doi (1).pdf
CTDL-04-Ngan xep va Hang doi (1).pdf
 
02 stack queue
02 stack queue02 stack queue
02 stack queue
 
Huong dan 8 o so
Huong dan 8 o soHuong dan 8 o so
Huong dan 8 o so
 
Baitap ktlt
Baitap ktltBaitap ktlt
Baitap ktlt
 
Baitap ktlt
Baitap ktltBaitap ktlt
Baitap ktlt
 
Cẩm nang kết cấu xây dựng
Cẩm nang kết cấu xây dựngCẩm nang kết cấu xây dựng
Cẩm nang kết cấu xây dựng
 
Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Bài tập CTDL và GT 13
Bài tập CTDL và GT 13
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
 
GV
GVGV
GV
 
Cac van de co so kh may tinh
Cac van de co so kh may tinhCac van de co so kh may tinh
Cac van de co so kh may tinh
 
08 long gagd_t3+t5
08 long gagd_t3+t508 long gagd_t3+t5
08 long gagd_t3+t5
 
Huong danthuchanhmang
Huong danthuchanhmangHuong danthuchanhmang
Huong danthuchanhmang
 
344444
344444344444
344444
 

Ctdl lab07-cac thuat-toan_sap_xep

  • 1. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t Trang1 CÁC THUẬT TOÁN SẮP XẾP M C TIÊU Hoàn tất bài thực hành này, sinh viên có thể: - Hiểu được các thuật toán sắp xếp: Selection Sort, Heap Sort, Quick Sort, Merge Sort. - Áp dụng các thuật toán sắp xếp để giải quyết các bài toán sắp xếp đơn giản. - Áp dụng các thuật toán sắp xếp để giải quyết các bài toán sắp xếp trên danh sách các cấu trúc theo từng khóa. - So sánh, đánh giá thời gian chạy của thuật toán với số lượng phần tử lớn. Thời gian thực hành: từ 120 phút đến 400 phút TÓM T T 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ữ tại mỗi phần tử. Mức độ hiệu quả của từng giải thuật phụ thuộc vào tính chất của cấu trúc dữ liệu cụ thể mà nó tác động đến. Có nhiều giải thuật sắp xếp: Selection sort, Insertion sort, Interchange sort, Bubble sort, Shaker sort, Binary Insertion sort, Shell sort, Heap sort, Quick sort, Merge sort, Radix sort… Selection sort • 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ử. Heap sort Heap là một dãy các phần tử aleft, aleft+1,... , aright sao cho: ai ≥ a2i và ai ≥ a2i+1, ∀i ∈ [left, right]. (ai , a2i), (ai ,a2i+1): các cặp phần tử liên đới. Heap được định nghĩa như trên được dùng trong trường hợp sắp xếp tăng dần, khi sắp xếp giảm dần phải đổi chiều các quan hệ. Ví dụ 1: Dãy số 5 2 6 4 8 1 được bố trí theo quan hệ so sánh và tạo thành cấu trúc như sau: Phần tử ở mức i chính là phần tử lớn trong cặp phần tử tương ứng ở mức i+1 Ví dụ 2: Loại bỏ 8 ra khỏi cây.
  • 2. Tài li u hư ng d n th c hành môn Tiến hành nhiều lần việc loại bỏ phầ ∞, khi đó xếp các phần tử theo thứ tự Quick sort Phân chia dãy thành các đoạn con như sau: • Đoạn thứ 2 đã có thứ tự. • Nếu các đoạn 1 và 3 chỉ có 1 ph đã được sắp. • Ngược lại, nếu các đoạn 1 và 3 có nhi khi các đoạn 1, 3 được sắp. • Để sắp xếp các đoạn 1 và 3, ta l phương pháp phân hoạch dãy ban Với x là một phần tử tùy ý trong dãy và Merge sort • Phân hoạch dãy ban đầu thành các dãy con • Làm giảm số dãy con bằng cách tr của dãy ban đầu. N I DUNG TH C HÀNH Cơ bản Sinh viên đọc kỹ phát biểu bài tập và th Sử dụng các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort số nguyên theo thứ tự tăng dần. Người dùng sẽ lần lượt nhập chiều dài n và các ph bộ dãy A được lưu trữ trong một mả Lần lượt sử dụng các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort A. Chương trình sẽ in các kết quả sắ Phân tích Selection sort Phân tích - Dùng vòng lặp để tìm phần t - Đảo phần tử đó ra đầu mảng Chương trình mẫu (CacThuatToanSapXep) c hành môn C u trúc d li u và gi i thu t ần tử gốc của cây cho đến khi tất cả các phần tử ự loại bỏ trên cây sẽ có dãy đã sắp xếp. như sau: có 1 phần tử thì chúng cũng đã có thứ tự, khi đó d n 1 và 3 có nhiều hơn 1 phần tử thì dãy con ban đ n 1 và 3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng ch dãy ban đầu vừa trình bày … tùy ý trong dãy và thường được chọn là vị trí chính giữa dãy ban đ u thành các dãy con liên tiếp mà mỗi dãy con đều đã có th ng cách trộn từng cặp dãy con của hai dãy phụ thành m p và thực hiện theo hướng dẫn: Selection Sort, Heap Sort, Quick Sort, Merge Sort để sắp x u dài n và các phần tử của dãy các nguyên A từ ảng số nguyên. Selection Sort, Heap Sort, Quick Sort, Merge Sort ắp xếp theo từng thuật toán ra màn hình. n tử nhỏ nhất trong dãy hiện hành. (CacThuatToanSapXep) Trang2 ử của cây đều là - , khi đó dãy con ban đầu đầu chỉ có thứ tự ng dãy con theo cùng y ban đầu. ã có thứ tự.. thành một dãy con p xếp một dãy các bàn phím. Toàn Selection Sort, Heap Sort, Quick Sort, Merge Sort để sắp xếp dãy
  • 3. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang3 #include <stdio.h> void Swap(int &a, int &b) { int c = a; a = b; b = c; } void SelectionSort(int a[],int N ){ //Ghi chú: tại sao không sử dụng kí hiệu & trong hàm này? 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++){ //Ghi chu: vòng lặp này dùng để làm gì? min = i; for(int j = i+1; j < N ; j++){ //Ghi chu: vòng lặp này dùng để làm gì? if (a[j] < a[min]){ min = j; //Ghi chu: thao tác này dùng để làm gì? } } if (min != i){ Swap(a[min], a[i]); //Ghi chu: thao tác này dùng để làm gì? } } } void main() { int x[10] = {12, 2, 8, 5, 1, 6, 4, 15}; // khởi tạo các giá trị trong mảng int n = 8; // số phần tử của mảng SelectionSort(x, n); for (int i=0; i<n ; i++){ printf("%d ", x[i]); } } Yêu cầu 1. Biên dịch đoạn chương trình nêu trên. 2. Tại sao trong hàm SelectionSort, vòng lặp thứ nhất có điều kiện là i < N-1? 3. Trả lời các dòng lệnh có yêu cầu ghi chú. 4. Sửa lại chương trình để nhập dãy số nguyên từ file input.txt có nội dung như sau: 5 1 2 3 8 6 23 10 Sau đó dùng thuật toán Selection Sort sắp xếp dãy số nguyên trên tăng dần. 5. Sửa hàm SelectionSort trên để sắp xếp dãy số nguyên ở câu 4 giảm dần.
  • 4. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang4 Heap Sort Phân tích - Hiệu chỉnh dãy số ban đầu về dạng heap được định nghĩa trên mảng (hay list). - Áp dụng thuật toán Heap Sort trên cấu trúc này. Chương trình mẫu void Shift (int a[], int left, int right){ int x, curr, joint; curr = left; joint =2*curr+1; // a joint : Phần tử liên đới x = a[curr]; while (joint <= right){ if (joint < right){ // Ghi chú: điều kiện này có ý nghĩa gì? if (a[joint] < a[joint+1]){ joint = joint+1; } } if (a[joint]<x){ break; // Thỏa quan hệ liên đới } a[curr] = a[joint]; curr = joint; // Xét khả năng hiệu chỉnh lan truyền joint = 2*curr+1; } a[curr] = x; } Yêu cầu 1. Trả lời các dòng lệnh có yêu cầu ghi chú. 2. Cho biết chức năng của đoạn chương trình trên. 3. Viết hàm void CreateHeap(int a[], int N); để chuyển đổi dãy a0, a1, …, aN-1 thành heap. Gợi ý: Sử dụng hàm Shift bên trên với left hiện hành là phần tử ở giữa dãy ((N-1)/2). Lặp lại quá trình trên với left giảm dần về đầu dãy. 4. Viết hàm void HeapSort(int a[], int N); để sắp xếp một dãy số nguyên tăng dần. Gợi ý: Giai đoạn 1: Hiệu chỉnh dãy ban đầu thành heap Giai đoạn 2: Sắp xếp dãy số dựa trên heap. • Xét dãy hiện hành là dãy nhập • Hoán vị phần tử lớn nhất (a0) về vị trí cuối. • Xét dãy hiện hành loại đã trừ phần tử cuối. • Hiệu chỉnh lại dãy hiện hành thành heap • Lặp lại quá trình trên tới hết dãy ban đầu. 5. Bổ sung các hàm trên vào chương trình mẫu (CacThuatToanSapXep) đồng thời thay đổi hàm main và file input để sắp xếp dãy số nguyên sau tăng dần:
  • 5. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang5 44 55 12 42 94 18 6 67 6. Viết lại thuật toán Heap Sort để sắp xếp dãy số ở câu 3 giảm dần. Quick Sort Phân tích - Chọn phần tử làm mốc. - Tiến hành phân hoạch dãy ban đầu thành 3 phần ak<x (1), ak=x (2) và ak>x (3) theo thứ tự. - Lặp lại thao tác trên trên 2 đoạn (1) và (3) Chương trình mẫu 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; while(i < j) { while(a[i] < x){ i++; } while(a[j] > x){ j--; } if(i <= j) { Swap(a[i], a[j]); i++ ; j--; } } QuickSort(a, left, j); QuickSort(a, i, right); } Yêu cầu 1. Bổ sung các hàm trên vào chương trình mẫu (CacThuatToanSapXep) đồng thời thay đổi hàm main và file input để sắp xếp dãy số nguyên sau tăng dần: 42 23 74 11 65 58 94 36 99 87 2. Sửa lại chương trình để đếm số phép gán và số phép so sánh sự dụng trong hàm QuickSort.
  • 6. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang6 Merge Sort Phân tích - Phân phối đều luân phiên các dãy con độ dài k từ mảng a vào hai mảng b và c. - Trộn mảng b và mảng c vào mảng a. - Lặp lại quá trình trên với k tăng gấp đôi đến khi k lớn hơn hay bằng chiều dài của dãy. Chương trình mẫu int b[MAX], c[MAX], nb, nc; //// Ghi chú: 2 mảng này dùng để làm gì? void Distribute(int a[], int N, int &nb, int &nc, int k){ int i, pa, pb, pc; //Ghi chú: các biến này có ý nghĩa gì? pa = pb = pc = 0; while (pa < N){ for (i=0; (pa<N) && (i<k); i++, pa++, pb++){ //Ghi chú: vòng lặp này có ý nghĩa gì? b[pb] = a[pa]; } for (i=0; (pa<N) && (i<k); i++, pa++, pc++){ //Ghi chú: vòng lặp này có ý nghĩa gì? c[pc] = a[pa]; } } nb = pb; nc = pc; } void Merge(int a[], int nb, int nc, int k){ int pa, pb, pc; pa = pb = pc = 0; while ((pb < nb) && (pc < nc)){ MergeSubarr(a, nb, nc, pa, pb, pc, k); } while (pb < nb){ a[pa ++] = b[pb ++]; //Ghi chú: câu lệnh này có ý nghĩa gì? } while (pc < nc){ a[pa ++] = c[pc ++]; //Ghi chú: câu lệnh này có ý nghĩa gì? } }
  • 7. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang7 Trong đó hàm MergeSubarr được cài đặt như sau: void MergeSubarr(int a[], int nb, int nc, int &pa, int &pb, int &pc, int k){ int rb, rc; rb = min(nb, pb+k); rc = min(nc, pb+k); while ((pb < rb) && (pc < rc)){ if (b[pb] < c[pc]) a[pa ++] = b[pb ++]; else a[pa ++] = c[pc ++]; } while (pb < rb){ a[pa ++] = b[pb ++]; } while (pc < rc){ a[pa ++] = c[pc ++]; } } Yêu cầu 1. Trả lời các dòng lệnh có yêu cầu ghi chú. 2. Cho biết chức năng của từng hàm trên. 3. Bổ sung các hàm cần thiết vào chương trình mẫu (CacThuatToanSapXep) và viết hàm void MergeSort(int a[], int N); để sắp xếp dãy số nguyên sau tăng dần. 5 2 9 3 7 2 4 11 Gợi ý: Xem lại 2 thao tác đã nêu bên trên. 4. Sửa lại chương trình để sắp xếp dãy số trên giảm dần. Áp dụng – Nâng cao Cho dãy số nguyên A như sau: 12 2 15 -3 8 5 1 -8 6 0 4 15 1. Sắp xếp dãy trên tăng dần. 2. Suy ra số lớn thứ 3 trong dãy. 3. Suy ra số lượng phần tử lớn nhất trong dãy. 4. Sắp xếp dãy trên theo thứ tự giá trị tuyệt đối tăng dần. 5. Sắp xếp dãy trên theo quy luật sau: • các số dương (nếu có) ở đầu mảng và có thứ tự giảm dần, • các số âm (nếu có) ở cuối mảng và có thứ tự tăng dần. 6. Sắp xếp dãy trên theo quy luật:
  • 8. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang8 • các số chẵn (nếu có) ở đầu mảng và có thứ tự tăng dần, • các số lẻ (nếu có) ở cuối mảng và có thứ tự giảm dần. Cho một danh sách gồm các sinh viên sau: STT MSSV Họ và tên Năm sinh 1 1005 Trần Minh Thành 1991 2 1001 Trần Thị Bích 1988 3 1003 Trần Minh Thành 1990 4 1000 Võ Quang Vinh 1990 5 1008 Nguyễn Văn An 1990 7. Tạo một cấu trúc dữ liệu để xử lý danh sách trên. 8. Sắp xếp danh sách tăng dần theo mã số tăng dần. 9. Sắp xếp danh sách tăng dần theo tên (thứ tự bảng chữ cái) và năm sinh (nếu trùng tên thì sắp theo năm sinh tăng dần). BÀI T P THÊM 1. Viết chương trình so sánh các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort về các mặt sau: • Thời gian chạy. • Số phép gán. • Số phép so sánh. Gợi ý: Dùng mẫu chương trình sau để tính thời gian chạy một đoạn lệnh #include <time.h> … clock_t start, finish; start = clock(); //ðo n chương trình c n tính th i gian th c thi finish = clock(); clock_t duration = finish - start; //Th i gian th c thi … 2. Trong thuật toán QuickSort, nếu lấy x là phần tử dầu dãy, hãy viết chương trình và so sánh thời gian chạy thuật toán với khi lấy x là phần tử chính giữa dãy. 3. Sắp xếp dãy trên theo quy luật: • các số chẵn (nếu có) có thứ tự tăng dần, • các số lẻ (nếu có) có thứ tự giảm dần • tính chất chẵn/lẻ tại mỗi vị trí trong dãy A không thay đổi sau khi sắp xếp (tức là trước khi sắp xếp, tại vị trí i của dãy A là số chẵn/lẻ thì tại vị trí i của mảng sau khi sắp xếp cũng là số chẵn/lẻ)
  • 9. Tài li u hư ng d n th c hành môn C u trúc d li u và gi i thu t HCMUS 2010 Trang9 Ví dụ: A = (1, 1, 2, 3, 4, 5, 6, 7) Kết quả kq = (1, 1, 6, 3, 4, 5, 2, 7). 4. Viết lại các thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort.với cấu trúc dữ liệu dạng danh sách liên kết đơn. 5.Tìm hiểu và cài đặt thuật toán Insertion Sort. 6. Tìm hiểu và cài đặt thuật toán Binary Insertion Sort. 7. Tìm hiểu và cài đặt thuật toán Interchange Sort. 8. Tìm hiểu và cài đặt thuật toán Bubble Sort. 9. Tìm hiểu và cài đặt thuật toán Shaker Sort. 10. Tìm hiểu và cài đặt thuật toán Shell Sort. 11. Tìm hiểu và cài đặt thuật toán Radix Sort lần lượt trên 2 loại cấu trúc dữ liệu dạng mảng và dạng danh sách liên kết. So sánh và rút ra nhận xét.