1. Trang chủ
  2. » Nông - Lâm - Ngư

Bài tập kỹ thuật lập trình – Các thuật toán sắp xếp

9 304 2

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 293,86 KB

Nội dung

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ần3. 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ộ[r]

(1)

Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật

T

ra

n

g

1

CÁC THUẬT TỐN SẮP XẾP MỤC TIÊU

Hồn tất thực hành này, sinh viên có thể:

- Hiểu thuật toán xếp: Selection Sort, Heap Sort, Quick Sort, Merge Sort - Áp dụng thuật toán xếp để giải toán xếp đơn giản

- Áp dụng thuật toán xếp để giải toán xếp danh sách cấu trúc theo khóa

- So sánh, đánh giá thời gian chạy 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 trình xử lý danh sách phần tử (hoặc mẫu tin) để đặt chúng theo thứ tự thỏa mãn tiêu chuẩn dựa nội dung thơng tin lưu giữ phần tử

Mức độ hiệu giải thuật phụ thuộc vào tính chất cấu trúc liệu cụ thể mà tác động đến

Có nhiều giải thuật 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ỏ N phần tử ban đầu, đưa phần tử vị trí đầu dãy hành

• Xem dãy hành cịn N-1 phần tử dãy ban đầu, vị trí thứ 2; lặp lại q trình cho dãy hành đến dãy hành phần tử

Heap sort

Heap dãy phần tử aleft, aleft+1, , aright cho: ≥ a2i ≥ a2i+1,∀i ∈ [left, right] (ai , a2i), (ai ,a2i+1): cặp phần tử liên đới

Heap định nghĩa dùng trường hợp xếp tăng dần, xếp giảm dần phải đổi chiều quan hệ

Ví dụ 1: Dãy số bố trí theo quan hệ so sánh tạo thành cấu trúc sau:

(2)

Tiến hành nhiều lần việc loại bỏ phầ ∞, xếp phần tử theo thứ tự Quick sort

Phân chia dãy thành đoạn sau:

• Đoạn thứ có thứ tự • Nếu đoạn có ph

đã

• Ngược lại, đoạn có nhi đoạn 1,

• Để xếp đoạn 3, ta l phương pháp phân hoạch dãy ban Với x phần tử tùy ý dãy Merge sort

• Phân hoạch dãy ban đầu thành dãy • Làm giảm số dãy cách tr

của dãy ban đầu NỘI DUNG THỰC HÀNH

Sinh viên đọc kỹ phát biểu tập th

Sử dụng 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 nhập chiều dài n ph bộ dãy A lưu trữ mả

Lần lượt sử dụng thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort A Chương trình in kết 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ử đầu mảng

Chương trình mẫu (CacThuatToanSapXep)

ần tử gốc tất phần tử ự loại bỏ có dãy xếp

như sau:

có phần tử chúng có thứ tự, d n có nhiều phần tử dãy ban đ

n 3, ta tiến hành việc phân hoạch dãy theo ch dãy ban đầu vừa trình bày …

tùy ý dãy thường chọn vị trí dãy ban đ

u thành dãy liên tiếp mà dãy có th ng cách trộn cặp dãy hai dãy phụ thành m

p thực theo hướng dẫn:

Selection Sort, Heap Sort, Quick Sort, Merge Sort để x

u dài n phần tử dãy nguyên A từ ảng số nguyên

Selection Sort, Heap Sort, Quick Sort, Merge Sort ắp xếp theo thuật tốn hình

n tử nhỏ dãy hành (CacThuatToanSapXep) T n g 2

-, dãy ban đầu đầu có thứ tự ng dãy theo

y ban đầu

ã có thứ tự thành dãy

p xếp dãy

bàn phím Tồn

(3)

Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010

T

ra

n

g

3

#include <stdio.h>

voidSwap(int &a, int &b) {

int c = a; a = b; b = c; }

voidSelectionSort(int a[],int N ){ //Ghi chú: khơng sử dụng kí hiệu & hàm này?

int min; //chỉ số phần tử nhỏ dãy hành

for (int i=0; i<N-1 ; i++){ //Ghi chu: vòng lặp dùng để làm gì? = i;

for(int j = i+1; j < N ; j++){ //Ghi chu: vịng lặp dùng để làm gì?

if (a[j] < a[min]){

= j; //Ghi chu: thao tác dùng để làm gì?

} }

if (min != i){

Swap(a[min], a[i]); //Ghi chu: thao tác dùng để làm gì?

} } }

void main() {

int x[10] = {12, 2, 8, 5, 1, 6, 4, 15}; // khởi tạo giá trị mảng

int n = 8; // số phần tử 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

2 Tại hàm SelectionSort, vịng lặp thứ có điều kiện i < N-1? Trả lời dòng lệnh có yêu cầu ghi

4 Sửa lại chương trình để nhập dãy số ngun từ file input.txt có nội dung sau: 23 10

(4)

T

ra

n

g

4

Heap Sort Phân tích

- Hiệu chỉnh dãy số ban đầu dạng heap định nghĩa mảng (hay list) - Áp dụng thuật toán Heap Sort cấu trúc

Chương trình mẫu

voidShift (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 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ả hiệu chỉnh lan truyền joint = 2*curr+1;

}

a[curr] = x; }

Yêu cầu

1 Trả lời dịng lệnh có u cầu ghi Cho biết chức đoạn chương trình

3 Viết hàm voidCreateHeap(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 với left hành phần tử dãy ((N-1)/2) Lặp lại trình với left giảm dần đầu dãy

4 Viết hàm voidHeapSort(int a[], int N); để xếp 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 heap • Xét dãy hành dãy nhập

• Hốn vị phần tử lớn (a0) vị trí cuối • Xét dãy hành loại trừ phần tử cuối • Hiệu chỉnh lại dãy hành thành heap • Lặp lại q trình tới hết dãy ban đầu

(5)

Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010

T

ra

n

g

5

44 55 12 42 94 18 67 Viết lại thuật toán Heap Sort để xếp dãy số câu 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 phần ak<x (1), ak=x (2) ak>x (3) theo thứ tự - Lặp lại thao tác trên đoạn (1) (3)

Chương trình mẫu

voidQuickSort(int a[], int left, int right){ int i, j, x;

if (left >= right){ return; }

x = a[(left+right)/2]; // chọn phần tử 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 hàm vào chương trình mẫu (CacThuatToanSapXep) đồng thời thay đổi hàm main file input để xếp dãy số nguyên sau tăng dần:

42 23 74 11 65 58 94 36 99 87

(6)

T

ra

n

g

6

Merge Sort Phân tích

- Phân phối luân phiên dãy độ dài k từ mảng a vào hai mảng b c - Trộn mảng b mảng c vào mảng a

- Lặp lại trình với k tăng gấp đôi đến k lớn hay chiều dài dãy Chương trình mẫu

int b[MAX], c[MAX], nb, nc;//// Ghi chú: mảng dùng để làm gì?

voidDistribute(int a[], int N, int &nb, int &nc, int k){ int i, pa, pb, pc; //Ghi chú: biến 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 có ý nghĩa gì?

b[pb] = a[pa]; }

for (i=0; (pa<N) && (i<k); i++, pa++, pc++){ //Ghi chú: vịng lặp có ý nghĩa gì?

c[pc] = a[pa]; }

}

nb = pb; nc = pc; }

voidMerge(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 có ý nghĩa gì?

}

while (pc < nc){

a[pa ++] = c[pc ++]; //Ghi chú: câu lệnh có ý nghĩa gì?

(7)

Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010

T

ra

n

g

7

Trong hàm MergeSubarr cài đặt sau:

voidMergeSubarr(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 dòng lệnh có yêu cầu ghi Cho biết chức hàm

3 Bổ sung hàm cần thiết vào chương trình mẫu (CacThuatToanSapXep) viết hàm void

MergeSort(int a[], int N); để xếp dãy số nguyên sau tăng dần 11 Gợi ý: Xem lại thao tác nêu bên

4 Sửa lại chương trình để xếp dãy số giảm dần

Áp dụng – Nâng cao

Cho dãy số nguyên A sau:

12 15 -3 -8 15 Sắp xếp dãy tăng dần

2 Suy số lớn thứ dãy

3 Suy số lượng phần tử lớn dãy

4 Sắp xếp dãy theo thứ tự giá trị tuyệt đối tăng dần Sắp xếp dãy theo quy luật sau:

(8)

T

ra

n

g

8

• số chẵn (nếu có) đầu mảng có thứ tự tăng dần, • số lẻ (nếu có) cuối mảng có thứ tự giảm dần Cho danh sách gồm sinh viên sau:

STT MSSV Họ 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 Tạo cấu trúc liệu để xử lý danh sách

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) năm sinh (nếu trùng tên theo năm sinh tăng dần)

BÀI TẬP THÊM

1 Viết chương trình so sánh thuật tốn Selection Sort, Heap Sort, Quick Sort, Merge Sort 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 đ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, lấy x phần tử dầu dãy, viết chương trình so sánh thời gian chạy thuật toán với lấy x phần tử dãy

3 Sắp xếp dãy theo quy luật:

• số chẵn (nếu có) có thứ tự tăng dần, • số lẻ (nếu có) có thứ tự giảm dần

(9)

Tài liệu hướng dẫn thực hành môn Cấu trúc liệu giải thuật HCMUS 2010

T

ra

n

g

9

Ví dụ: A = (1, 1, 2, 3, 4, 5, 6, 7) Kết kq = (1, 1, 6, 3, 4, 5, 2, 7)

4 Viết lại thuật toán Selection Sort, Heap Sort, Quick Sort, Merge Sort.với cấu trúc liệu dạng danh sách liên kết đơn

5.Tìm hiểu cài đặt thuật tốn Insertion Sort

6 Tìm hiểu cài đặt thuật toán Binary Insertion Sort Tìm hiểu cài đặt thuật tốn Interchange Sort Tìm hiểu cài đặt thuật tốn Bubble Sort Tìm hiểu cài đặt thuật tốn Shaker Sort 10 Tìm hiểu cài đặt thuật tốn Shell Sort

Ngày đăng: 20/04/2021, 15:35

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w