(TIỂU LUẬN) DAY 14 c++ with fsof thuật toán sắp xếp

25 8 0
(TIỂU LUẬN) DAY 14 c++ with fsof thuật toán 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

DAY 14 C++ With Fsoft Nhóm Sinh viên thực hiện: Lê Việt Anh Phạm Công Tuyên Nguyễn Đức Cường Hứa Ký Ngân Thuật toán xếp • Sắp xếp (Sorting) – Là q trình tổ chức lại họ liệu theo thứ tự giảm dần tăng dần (ascending or descending order) gì? • Dữ liệu cần xếp – Số nguyên (Integers) – Xâu ký tự (Character strings) – Đối tượng (Objects) • Các loại thuật tốn xếp – Sắp xếp (internal sort) • Địi hỏi họ liệu đưa toàn vào nhớ máy tính – Sắp xếp ngồi (external sort) • Họ liệu khơng thể lúc đưa tồn vào nhớ trong, đọc vào phận từ nhớ ngồi • Các đặc trưng thuật toán xếp: – Tại chỗ (in place): khơng gian nhớ phụ mà thuật tốn địi hỏi O(1), nghĩa bị chặn số không phụ thuộc vào độ dài dãy cần xếp – Ổn định (stable): Nếu phần tử có giá trị giữ nguyên thứ tự tương đối chúng trước xếp • Có hai phép toán mà thuật toán xếp thường phải sử dụng: – Đổi chỗ (Swap): Thời gian thực O(1) – So sánh: Compare(a, b) trả lại true a trước b thứ tự cần xếp false trái lại Ba 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) Sắp xếp chèn (Insertion Sort) Để chèn 12, ta cần tạo chỗ cho việc dịch chuyển 36 sau 24 • Thuật tốn: – Tại bước k = 1, 2, , n, đưa phần tử thứ k mảng cho vào vị trí dãy gồm k phần tử – Kết sau bước k, k phần tử thứ tự void insertionSort(int a[], int array_size) { int i, j, last; for (i=1; i < array_size; i++) { last = a[i]; j = i; while ((j > 0) && (a[j-1] > last)) { a[j] = a[j-1]; j = j - 1; } a[j] = last; } // end for } // end of isort Giải thích: • Ở đầu lần lặp i vịng "for" ngoài, liệu từ a[0] đến a[i-1] xếp • Vịng lặp "while" tìm vị trí cho phần tử (last =a[i]) dãy gồm i phần tử 13 phép đổi chỗ: 20 phép so sánh: • Sắp xếp chèn chỗ ổn định (In place and Stable) • Phân tích thời gian tính thuật tốn • – Best Case: hốn đổi, n-1 so sánh (khi dãy đầu vào sắp) • – Worst Case: n2/2 hốn đổi so sánh (khi dãy đầu vào có thứ tự ngược lại với thứ tự cần xếp) • – Average Case: n2/4 hốn đổi so sánh • Thuật tốn có thời gian tính tình tốt tốt • Là thuật tốn xếp tốt dãy gần xếp – Nghĩa phần tử đứng vị trí gần vị trí thứ tự cần xếp Sắp xếp chọn (Selection Sort) Sắp xếp chọn (Selection Sort) • Thuật tốn – Tìm phần tử nhỏ đưa vào vị trí – Tìm phần tử nhỏ đưa vào vị trí – Tìm phần tử nhỏ đưa vào vị trí – void selectionSort(int a[], int n){ int i, j, min, temp; for (i = 0; i < n-1; i++) { = i; For (j = i+1; j < n; j++){ if (a[j] < a[min]) = j; } swap(a[i], a[min]); } } •Best case: đổi chỗ (n-1 đoạn mã), n2/2 so sánh •Worst case: n - đổi chỗ n2/2 so sánh •Average case: O(n) đổi chỗ n2/2 so sánh • Ưu điểm bật xếp chọn số phép đổi chỗ Điều có ýnghĩa việc đổi chỗ tốn Lớp map lớp map nằm thư viện map muốn sử dụng trước tiên phải #include Cú pháp khai báo: map variableName; Ví dụ Biến dictionary khai báo với cặp liệu , vậy: •key dictionary phải kiểu string - "eat" "sleep" •value dictionary phải kiểu string - "an" "ngu" Lớp map giống lớp vector, list định nghĩa hàm thành viên hỗ trợ cho việc truy xuất, lấy kích thước, constructor override, … Sắp xếp bọt - Bubble Sort • Bubble sort phương pháp xếp đơn giản thường sử dụng ví dụ minh hoạ cho giáo trình nhập mơn lập trình • Bắt đầu từ đầu dãy, thuật toán tiến hành so sánh phần tử với phần tử sau thực đổi chỗ, chúng khơng theo thứ tự Q trình lặp lại gặp lần duyệt từđầu dãy đến cuối dãy mà thực đổi chỗ (tức tất phần tử đứng vị trí) Cách làm đẩy phần tử lớnnhất xuống cuối dãy, phần tử có giá trị nhỏ dịch chuyển đầu dãy • Mặc dù thuật tốn đơn giản, thuật tốn hiệu ba thuật tốn trình bày mục Vì ngồi mục đích giảng dạy, Sắp xếp bọt sử dụng void bubbleSort(int a[], int n){ int i, j; for (i = (n-1); i >= 0; i ) { for (j = 1; j a[j]) swap(a[j-1],a[j]); } } } • Best case: đổi chỗ, n2/2 so sánh • Worst case: n2/2 đổi chỗ so sánh • Average case: n2/4 đổi chỗ n2/2 so sánh Sắp xếp trộn (Merge Sort) • Bài tốn: Cần xếp mảng A[1 n]: • Chia (Divide) – Chia dãy gồm n phần tử cần xếp thành dãy, dãy có n/2 phần tử • Trị (Conquer) – Sắp xếp dãy cách đệ qui sử dụng xếp trộn – Khi dãy phần tử trả lại phần tử • Tổ hợp (Combine) – Trộn (Merge) hai dãy xếp để thu dãy xếp gồm tất phần tử hai dãy MERGE-SORT(A, p, r) if p < r then q ← (p + r)/2 MERGE-SORT(A, p, q) MERGE-SORT(A, q + 1, r) MERGE(A, p, q, r) endif Kiểm tra điều kiện Chia (Divide) Trị (Conquer) Trị (Conquer) Tổ hợp (Combine) • Lệnh gọi thực thuật tốn: MERGE-SORT(A, 1, n) • MERGE(A, p, q, r) Tính n1 n2 Sao n1 phần tử vào L[1 n1] n2 phần tử vào R[1 n2] L[n1 + 1] ← ; R[n2 + 1] ← i ← 1; j ← for k ← p to r if L[ i ] ≤ R[ j ] then A[k] ← L[ i ] i ←i + 10 else A[k] ← R[ j ] j←j+1 void merge(DataType A[], int first, int mid, int last){ DataType tempA[MAX_SIZE]; // mảng phụ int first1 = first; int last1 = mid; int first2 = mid + 1; int last2 = last; int index = first1; for (; (first1

Ngày đăng: 07/12/2022, 09:58

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

  • Đang cập nhật ...

Tài liệu liên quan