Mô tả chi tiết thuật toán • Mảng có 1 phần tử là mảng đã sắp xếp • Nếu có hai mảng a và b đã được sắp xếp, tiến hành trộn hai dãy này thành dãy c đã được sắp xếp. • Nếu chia nhỏ mảng cần sắp xếp thành các đoạn 1 phần tử thì nó là đoạn được sắp xếp. • Tiến hành ghép các đoạn nhỏ thành các đoạn lớn hơn đã được sắp xếp. a) Ý tưởng thao tác trộn Ý tưởng thuật toán: Chúng ta sẽ chia mảng lớn thành những mảng con nhỏ hơn bằng cách chia đôi mảng lớn và chúng ta tiếp tục chia đôi các mảng con cho tới khi mảng con nhỏ nhất chỉ còn 1 phần tử. Sau đó chúng ta sẽ tiếng hành so sánh 2 mảng con có cùng mảng cơ sở (khi chúng ta chia đôi mảng lớn thành 2 mảng con thì mảng lớn đó chúng ta gọi là mảng cơ sở của 2 mảng con đó) khi so sánh chúng sẽ vừa sắp xếp vừa ghép 2 mảng con đó lại thành mảng cơ sở, chúng ta tiếp tục so sánh và ghép các mảng con lại đến khi còn lại mảng duy nhất thì đó là mảng đã được sắp xếp Cách thức thực hiện ý tưởng : • Duyệt trên dãy a tại vị trí i ( i là vị trí bắt đầu của dãy a )
HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN ****** ***** BÁO CÁO PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT ĐỀ TÀI:”Thiết kế toán xếp dãy số theo giá trị” Giáo viên hướng dẫn: Hà Đại Dương Sinh viên thực hiện: Lê Văn Nhật Lớp : HTTT 14 Hà Nội, Tháng Năm 2018 Mục Lục Nêu toán Mô tả chi tiết thuật toán .3 Thực với liệu với n>=10 4 Viết chương trình Đánh giá độ phức tạp thuật toán theo lý thuyết thực nghiệm, so sánh kết Đề bài: ( Đề 2) Thiết kế thuật toán xếp theo phương pháp chia để trị, thuật tốn MergeSort, với cơng việc sau: Nêu bài tốn; Mơ tả chi tiết thuật toán; Tự xác định liệu ( với số phần tử mảng >=10), vỡi liệu thực bước thuật toán mô tả mục ghi kết bước; Viết chương trình sử dụng C, C++ Đánh giá độ phức tạp thuật toán theo lý thuyết thực nghiệm, so sánh kết quả; Viết bào cáo ( trình bày nội dung từ 1-5) Bài làm : Nêu toán Cho mảng gồm n phần tử A[1…n], xếp mảng A theo thứ tự tăng dần Mô tả chi tiết thuật tốn Mảng có phần tử mảng xếp Nếu có hai mảng a b xếp, tiến hành trộn hai dãy thành dãy c xếp Nếu chia nhỏ mảng cần xếp thành đoạn phần tử đoạn xếp Tiến hành ghép đoạn nhỏ thành đoạn lớn xếp a) Ý tưởng thao tác trộn Ý tưởng thuật toán: - Chúng ta chia mảng lớn thành mảng nhỏ cách chia đôi mảng lớn tiếp tục chia đôi mảng mảng nhỏ phần tử Sau tiếng hành so sánh mảng có mảng sở (khi chia đơi mảng lớn thành mảng mảng lớn gọi mảng sở mảng đó) so sánh chúng vừa xếp vừa ghép mảng lại thành mảng sở, tiếp tục so sánh ghép mảng lại đến lại mảng mảng xếp - Cách thức thực ý tưởng : Duyệt dãy a vị trí i ( i vị trí bắt đầu dãy a ) Duyệt dãy b ví trí j ( j vị trí bắt đầu dãy b ) Nếu a[i]>b[j] thêmb[j] vào dãy c tăng biến j ngược lại thêm a[i] vào dãy tang biến i Nếu dãy hết trước thỳ tiến hành đưa tồn dãy lại vào dãy c Áp dụng trường hợp a, b đoạn mảng - a ( left, mid ), b ( mid +1, right ) - array( left , right ) Để thuận tiện xử lý thỳ ta trả lại toàn giá trị vào mảng ban đầu Giải mã: o Input: a ( left , mid ) , a ( mid , right ) o Output: array(left , right ) xếp không giảm i =left j = mid +1 k = left while( i < mid && j < right ) if ( a[i] < a[j] ) array[k] = a[i] i++ else array[k] = a[j] j++ k++ while ( i left) { int mid; // Phan tu o giua mid = (left + right) / 2; MergeSort(array, left, mid); // Goi de quy mang ben trai MergeSort(array, mid + 1, right); // Goi de quy mang ben phai Merge(array, left, mid, right); // Goi ham so sanh hai mang } } void Merge(int array[], int left, int mid, int right) { int *temp; // Khoi tao mang tam de sap xep int i = left; // Vi tri phan tu dau tien cua mang ben trai int j = mid + 1; // Vi tri phan tu dau tien cua mang ben phai temp = new int[right - left + 1]; // Khoi tao so luong phan tu cua mang tam for (int k = 0; k