Đề tài nghiên cứu khoa học tìm hiểu về thuật toán sắp xếp

48 421 1
Đề tài nghiên cứu khoa học tìm hiểu về 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

hocthuat.vn –Tài liệu online miễn phí NGHIÊN CỨU KHOA HỌC Đề tài : Tìm hiểu Thuật Toán Sắp Xếp Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí Mục lục NGHIÊN CỨU KHOA HỌC Đề tài : Tìm hiểu Thuật Toán Sắp Xếp Mục lục PHẦN MỞ ĐẦU Lý chọn đề tài Mục tiêu nhiệm vụ Chƣơng MỘT SỐ KIẾN THỨC CƠ SỞ 1.1 Thuật toán 1.1.1 Khái niệm thuật toán 1.1.2 Các đặc trƣng thuật toán Chƣơng MÔ PHỎNG THUẬT TOÁN 10 2.1 Tổng quan mô thuật toán 10 2.1.1 Khái niệm mô thuật toán 10 2.1.2 Lịch sử mô thuật toán 11 2.1.3 Tác dụng mô thuật toán 14 2.1.4 Kiến trúc hệ thống mô thuật toán 18 2.1.5 Lựa chọn công cụ mô thuật toán 20 2.2 Một số yêu cầu mô thuật toán 21 2.2.1 Mô tả theo thuật toán 21 2.2.2 Hệ thống mô phải đƣợc thực theo bƣớc 21 2.2.3 Mô thuật toán phải có tính động 21 2.2.4 Phải tạo phân cấp cho ngƣời học 22 2.2.5 Cấu trúc mô thuật toán 22 2.3 Quy trình thiết kế nhiệm vụ mô thuật toán 23 2.3.1 Nghiên cứu phân tích giải thuật 23 2.3.2 Phân tích giải thuật thành nhiều bƣớc, sau lần lƣợt mô bƣớc 26 2.3.3 Phân tích khả tổng hợp bƣớc phân tích thành giải thuật 27 2.3.4 Phân tích khó khăn thuận lợi với ngƣời lần biết đến giải thuật 27 2.4 Kết luận 28 Chƣơng3 : CHƢƠNG TRÌNH ỨNG DỤNG THUẬT TOÁN SẮP XẾP 29 3.1 CÁC THUẬT TOÁN SẮP XẾP ĐƠN GIẢN 30 3.1.1 Sắp xếp lựa chọn 30 3.1.2 Sắp xếp xen vào 32 3.1.3 Sắp xếp bọt 33 3.2 Sắp xếp hòa nhập 35 Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí 3.3 3.4 Sắp xếp nhanh 38 Sắp xếp sử dụng thứ tự phận 45 Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí PHẦN MỞ ĐẦU Lý chọn đề tài Trong hai thập kỷ qua, mô thuật toán đƣợc nhà sƣ phạm ngành công nghệ thông tin sử dụng nhƣ công cụ có tính chất giúp đỡ việc dạy thuật toán đồ thị, thuật toán xếp, … khác máy tính Nguyên nhân việc mô thuật toán đƣợc sử dụng nhƣ công cụ trợ giúp cho việc giảng dạy cung cấp mô động đồ họa thuật toán thay đổi cấu trúc liệu suốt trình thực thi Nhƣ phần trình học thuật toán, sinh viên ngành công nghệ thông tin học cấu trúc trình biên dịch (compiler) ngôn ngữ lập trình cho trình Điều cho nhiệm vụ giai đoạn khác trình biên dịch Hiện nay, số hệ thống mô thuật toán đƣợc phát triển sau hai thập kỷ Hầu hết thuật toán đƣợc đề cập đến giai đoạn hệ thống phổ biến tinh vi hệ thống mà thực tế sử dụng Mô thuật toán ngày trở nên hữu ích trở thành giáo cụ trực quan quan trọng hầu hết lĩnh vực, môi trƣờng giáo dục Với nhà sƣ phạm ngành công nghệ thông tin mô thuật toán có tác dụng nhƣ tài liệu hƣớng dẫn việc dạy thuật toán máy tính Đặc biệt, giúp học sinh sinh viên hiểu cấu trúc liệu thuật toán nhanh Nhƣ vậy, mô thuật toán góp phần to lớn vào việc ứng dụng CNTT giảng dạy góp phần vào phát triển nhanh chóng hệ thống elearning Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí Thuật toán xếp đa dạng phong phú Vì vấn đề “ Mô thuật toán xếp ” đƣợc chọn để nghiên cứu khóa luận Mục tiêu nhiệm vụ  Nghiên cứu tổng quan mô thuật toán  Hƣớng đến kỹ thuật lập trình với mã nguồn mở ngôn ngữ lập trình C#  Áp dụng kết nghiên cứu làm demo mô thuật toán xếp Cấu trúc khóa luận Chƣơng 1: Một số kiến thức sở  Trình bày khái niệm thuật toán, đặc trƣng thuật toán  Độ phức tạp thuật toán Chƣơng 2: Mô thuật toán  Tổng quan mô thuật toán  Một số yêu cầu mô thuật toán  Quy trình thiết kế nhiệm vụ mô thuật toán Chƣơng 3: Chƣơng trình ứng dụng thuật toán xếp Phân tích thiết kế hệ thống mô thuật toán xếp  Phân tích số thuật toán Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí Chƣơng MỘT SỐ KIẾN THỨC CƠ SỞ 1.1 Thuật toán 1.1.1 Khái niệm thuật toán Thuật ngữ “algorithm” (thuật toán gọi giải thuật) đƣợc gọi theo tên nhà toán học Ả rập kỷ IX al-Khowarizmi, ngƣời viết sách chữ số Hindu – sở kí hiệu số thập phân đại (xem [4], trang 118) Xuất xứ ban đầu từ algorism, đƣợc dùng để quy tắc thực phép tính số học số thập phân Sau đó, vào kỷ XVIII algorism biến thành algorithm Với quan tâm ngày tăng máy tính, khái niệm thuật toán đƣợc cho ý nghĩa chung hơn, bao hàm thủ tục xác định để giải toán, thủ tục để thực phép tính số học Thuật toán dãy hữu hạn thao tác đƣợc xếp theo trình tự xác định cho sau thực dãy thao tác ấy, từ Input toán ta nhận đƣợc Output cần tìm Cũng xem thuật toán nhƣ công cụ để giải toán cụ thể Phát biểu toán định tổng quát mối quan hệ Input/Output cần thiết Thuật toán mô tả thủ tục tính toán cụ thể để đạt đƣợc mối quan hệ Input/Output Vào khoảng năm 1930 - 1936, lần lƣợt nhà toán học K.Gödel, S Kleene, A Church, A Turing đề số định nghĩa khác cho Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí khái niệm thuật toán Trong số định nghĩa toán học khác (nhƣng tƣơng đƣơng) thuật toán, khái niệm Máy Turing (1937) Hàm đệ quy (1931-1936) đƣợc sử dụng rộng rãi có nhiều thuận tiện cho nghiên cứu lí thuyết lẫn thực hành 1.1.2 Các đặc trƣng thuật toán Các thuật toán có số tính chất chung, là:  Đầu vào (Input): Một thuật toán có giá trị đầu vào từ tập xác định  Đầu (Output): Từ tập giá trị đầu vào, thuật toán tạo giá trị đầu Các giá trị đầu nghiệm toán  Tính xác định: Các bƣớc thuật toán phải đƣợc xác định cách xác  Tính đắn: Một thuật toán phải cho giá trị đầu tập giá trị đầu vào  Tính hữu hạn: Một thuật toán phải tạo giá trị đầu sau số hữu hạn (có thể lớn) bƣớc thực tập đầu vào  Tính hiệu quả: Mỗi bƣớc thuật toán phải thực đƣợc cách xác khoảng thời gian chấp nhận đƣợc Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí  Tính tổng quát: Thuật toán cần phải áp dụng đƣợc cho tập liệu đầu vào toán, cho tập đặc biệt giá trị đầu vào 1.2.Độ phức tạp thuật toán Cần ý thuật toán giải lớp toán đó, nhƣng có nhiều thuật toán khác giải toán Một vấn đề đặt ta cần chọn thuật toán tốt để giải toán cho Nhƣng thuật toán tốt? Thƣớc đo hiệu thời gian máy tính sử dụng để giải toán theo thuật toán xét giá trị đầu vào có kích thƣớc xác định, dung lƣợng nhớ đòi hỏi để thực thuật toán Nhƣ xem xét đến độ phức tạp tính toán thuật toán ta phải xem xét đến độ phức tạp thời gian độ phức tạp không gian Độ phức tạp không gian gắn liền với cấu trúc liệu cụ thể đƣợc dùng để thực thuật toán Độ phức tạp thời gian: Độ phức tạp thời gian thuật toán biểu diễn qua số phép toán thực thuật toán giá trị đầu vào có kích thƣớc xác định Độ phức tạp trƣờng hợp xấu trƣờng hợp phải dùng tối đa phép toán để giải toán theo thuật toán xét Độ phức tạp trƣờng hợp trung bình, trƣờng hợp ta phải tìm số trung bình phép toán để giải toán toàn giá trị đầu vào có kích thƣớc cho Các thuật ngữ thường dùng cho độ phức tạp thuật toán: O(1): Độ phức tạp số Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí O(logn): Độ phức tạp lôgarit O(n): Độ phức tạp tuyến tính O(nlogn): Độ phức tạp nlogn O(nb): Độ phức tạp đa thức O(bn), b > 1: Độ phức tạp hàm mũ O(n!): Độ phức tạp giai thừa Sinh viên thực hiện:Nguyễn Hải Nam hocthuat.vn –Tài liệu online miễn phí Chƣơng MÔ PHỎNG THUẬT TOÁN 2.1 Tổng quan mô thuật toán 2.1.1 Khái niệm mô thuật toán Mô thuật toán trình tách liệu, thao tác, ngữ nghĩa tạo mô đồ họa cho trình [Stasko 1990] (xem [23]) Mô thuật toán đƣợc thiết kế để giúp ngƣời dùng hiểu thuật toán, đánh giá chƣơng trình sửa lỗi chƣơng trình Một chƣơng trình máy tính chứa cấu trúc liệu thuật toán mà thực thi Trong trình thực thi chƣơng trình, giá trị sở liệu đƣợc thay đổi Mô thuật toán sử dụng biểu diễn đồ họa để biểu diễn cấu trúc liệu thay đổi giá trị sở liệu trạng thái Thông qua đó, ngƣời sử dụng xem đƣợc bƣớc thực thi chƣơng trình nhờ hiểu chi tiết đƣợc thuật toán Mô thuật toán đƣợc dùng để đánh giá chƣơng trình có cách cung cấp mô cho thành phần hệ thống, nhờ kiểm tra đƣợc hiệu hệ thống Bên cạnh việc giúp ngƣời sử dụng hiểu hệ thống, mô thuật toán đƣợc dùng để giúp thực trình dò lỗi dễ dàng Để sử dụng mô thuật toán trình dò lỗi chƣơng trình, ngƣời sử dụng thích vào trạng thái chƣơng trình để tạo lệnh mô phỏng, sau chúng đƣợc đƣa vào hệ thống mô thuật toán để tạo mô Ngƣời sử dụng xem chƣơng trình họ thực nhƣ nào, giá trị liệu bƣớc bƣớc ảnh hƣởng Sinh viên thực hiện:Nguyễn Hải Nam 10 hocthuat.vn –Tài liệu online miễn phí tục lặp lại trình mô tả đoạn đầu A[0 i], với i = n-3, …,1, ta thu đƣợc mảng đƣợc Ta có hàm xếp bọt nhƣ sau: void BubbleSort( Item A[] , int n) { (1) for (int i = n-1 ; i > ; i ) (2) for (int k = ; k < i ; k++) (3) if ( A[k].key > A[k+1].key) Swap(A[k],A[k+1]); } Tƣơng tự nhƣ hàm xếp xen vào ,ta đánh giá thời gian chạy hàm xếp bọt O(n2 ) Trong hàm BubbleSort thực lệnh lặp (1), đến số i đó, n-1 ≥ i > 1, mà đoạn đầu A[0 i] đƣợc sắp, ta dừng Do ta cải tiến hàm BubbleSort cách đƣa vào biến sorted, biến nhận giá trị true A[0 i] đƣợc nhận giá trị false ngƣợc lại Khi sorted nhận giá trị true lệnh lặp (1) dừng lại void BubbleSort (Item A[] , int n) { for (int i = n-1 ; i > ; i ) { bool sorted = true; for( int k = ; k < i ; k++) if (A[k].key > A[k+1].key) { swap (A[k], A[k+1]); sorted = false; } if (sorted) break; } } Sinh viên thực hiện:Nguyễn Hải Nam 34 hocthuat.vn –Tài liệu online miễn phí 3.2 SẮP XẾP HOÀ NHẬP Thuật toán xếp hoà nhập (MergeSort) thuật toán đƣợc thết kế kỹ thuật chia - để - trị Giả sử ta cần xếp mảng A[a b], a, b số nguyên không âm, a b, a số đầu b số cuối mảng Ta chia mảng thành hai mảng số c nằm a b ( c = ( a + b ) / 2) Các mảng A[a c] A[c+1…b] đƣợc xếp cách gọi đệ quy thủ tục xếp hoà nhập Sau ta hoà nhập hai mảng A[a…c] A[c+1…b] đƣợc thành mảng A[a…b] đƣợc Giả sử Merge(A,a,c,b) hàm kết hợp hai mảng đƣợc A[a c] A[c+ b] thành mảng A[a b] đƣợc Thuật toán xếp hoà nhập đƣợc biểu diễn hàm đệ quy sau void MergeSort( Item A[ ], int a, int b) { if (a < b) { int c = (a + b)/2; MergeSort ( A, a, c ); MergeSort ( A, c+1, b); Merge ( A, a, c, b); } } Công việc lại ta thiết kế hàm hoà nhập Merge ( A, a, c, b), nhiệm vụ kết hợp hai nửa mảng đƣợc A[a…c] A[ c+1…b] thành mảng đƣợc Ý tƣởng thuật toán hoà nhập ta đọc lần lƣợt thành phần hai nửa mảng chép vào mảng phụ B[0 b-a] theo thứ tự tăng dần Giả sử i số chạy mảng A[a…c], i đƣợc khởi tạo a ; j số chạy mảng A[c+1 b], j đƣợc khởi tạo c + So sánh A[i] A[j], A[i].key < A[j].key ta chép A[i] vào mảng B tăng i lên 1, ngƣợc lại ta chép A[j] vào mảng B va tăng j lên Lặp lại hành động i vƣợt c j vƣợt b Nếu số i chƣa vƣợt c nhƣng j vƣợt b ta cần phải chép phần lại Sinh viên thực hiện:Nguyễn Hải Nam 35 hocthuat.vn –Tài liệu online miễn phí A[i…c] vào mảng B Tƣơng tự, i > c, nhƣng j  b ta cần chép phần lại A[j…b] vào mảng B Chẳng hạn, xét mảng số nguyên A[ 5…14], A[5…9] A[10…14] đƣợc nhƣ sau: i A j 10 12 20 31 35 a=5 c= 15 26 21 10 11 12 13 14 Bắt đầu i = , j = 10 Vì A[5] > A[10] nên A[10] = đƣợc chép vào mảng B j = 11 Ta lại có A[5] > A[11], nên A[11] = đƣợc chép vào mảng B j = 12 Đến dây A[5] < A[12], ta chép A[5] = 10 vào mảng B i = Tiếp tục nhƣ ta nhận đƣợc mảng B nhƣ sau: 10 12 15 B 21 26 20 Đến j = 15 > b = 14, i = < c = 9, ta chép nốt A[8] = 31 A[9] = 35 sang B để nhận đƣợc mảng B đƣợc Bây cần chép lại mảng B sang mảng A Hàm Merge đƣợc viết nhƣ sau: void Merge( Item A[] , int a , int c , int b) // a, c, b số nguyên không âm, a  c  b // Các mảng A[a…c] A[c+1…b] đƣợc { Sinh viên thực hiện:Nguyễn Hải Nam 36 hocthuat.vn –Tài liệu online miễn phí int i = a; int j = c + 1; int k = 0; int n = b – a + 1; Item * B = new Item[n]; (1) while (( i < c +1 ) && ( j < b +1 )) if ( A [i].key < A[j].key) B[k ++] = A[i ++]; else B[k ++] = A[j ++]; (2) while ( i < c + 1) B[k ++] = A[i++]; (3) while ( j < b +1) B[k ++] = A[ j ++]; i = a; (4) for ( k = ; k < n ; k ++) A[i ++] = B [k]; delete [ ] B; } Phân tích xếp hoà nhập Giả sử mảng cần xếp A[a…b] có độ dài n, n = b – a +1, T(n) thời gian chạy hàm MergeSort (A, a, b) Khi thời gian thực lời gọi đệ quy MergeSort (A, a, c) MergeSort (A, c + 1, b) T(n/2) Chúng ta cần đánh gía thời gian chạy hàm Merge(A, a, c, b) Xem xét hàm Merge ta thấy rằng, lệnh lặp (1), (2), (3) cần thực tất n lần lặp, lần lặp cần thực số cố định phép toán Do tổng thời gian ba lệnh lặp (1), (2), (3) O(n) Lệnh lặp (4) cần thời gian O(n) Khi thực hàm MergeSort(A, a, b) với a = b, phép so sánh phải thực hiện, T(1) = O(1) Từ hàm đệ quy MergeSort đánh giá trên, ta có quan hệ đệ quy sau T(1) = O(1) T(n) = 2T(n/2) + O(n) với n>1 Giả sử thời gian thực phép toán lần lặp hàm Merge số d đó, ta có : Sinh viên thực hiện:Nguyễn Hải Nam 37 hocthuat.vn –Tài liệu online miễn phí T(1)  d T(n)  2T(n/2) + nd Áp dụng phƣơng pháp lặp vào bất đẳng thức ta nhận đƣợc T(n)  2T(n/2) + n d  22 T(n/22) + (n/2)d + n d ……  2k T(n/2k) + n d + …+ n d (k lần nd) Giả sử k số nguyên dƣơng lớn cho  n / 2k Khi đó, ta có T(n)  2k T(1) + n d + … + n d ( k lần n d) T(n)  (k + 1) n d T(n)  (1 + log n) n d Vậy T(n) = O (n log n) 3.3 SẮP XẾP NHANH Trong mục trình bày thuật toán xếp đƣợc đƣa Hoare, tiếng với tên gọi xếp nhanh (QuickSort) Thời gian chạy thuật toán trƣờng hợp xấu O(n 2) Tuy nhiên thời gian chạy trung bình O(n logn) Thuật toán xếp nhanh đƣợc thiết kế kỹ thuật chia-để-trị nhƣ thuật toán xếp hòa nhập Nhƣng thuật toán xếp hòa nhập, mảng A[a…b] cần đƣợc chia đơn giản thành hai mảng A[a c] A[c+1 b] điểm chia mảng, c = (a+b)/2 Còn thuật toán xếp nhanh, việc “chia mảng thành hai mảng con” trình biến đổi phức tạp để từ mảng A[a b] ta thu đƣợc hai mảng A[a k-1] A[k+1 b] thỏa mãn tính chất sau : A[i].key ≤ A[k].key với i, a ≤ i ≤ k-1 Sinh viên thực hiện:Nguyễn Hải Nam 38 hocthuat.vn –Tài liệu online miễn phí A[j].key > A[k].key với j, k+1 ≤ j ≤ b Nếu thực đƣợc phân hoạch mảng A[a b] thành hai mảng A[a k-1] A[k+1 b] thỏa mãn tính chất trên, xếp đƣợc mảng ta có toàn mảng A[a b] đƣợc xếp Giả sử Partition(A, a, b, k) hàm phân hoạch mảng A[a b] thành hai mảng A[a k-1] A[k+1 b] Thuật toán xếp nhanh thuật toán đệ quy đƣợc biểu diễn hàm đệ quy nhƣ sau : void QuickSort(Item A[] , int a , int b) //Sắp xếp mảng A[a b] với a ≤ b { if (a < b) { int k; Partition(A, a, b, k); if (a right Lúc ta dễ thấy rằng, thành phần mảng A[a right] có khóa nhỏ hay mốc, thành phần mảng A[left b] có khóa lớn mốc Cuối ta trao đổi A[a] A[right] để đặt mốc vào vị trí k = right Hàm phân hoạch đƣợc viết nhƣ sau : void Partition( Item A[] , int a , int b , int & k) { keyType pivot = A[a].key; int left = a + 1; int right = b; { while (( left A[right] = 14 > nên right đƣợc giảm dừng lại right = 4, A[4] < Ta có hoàn cảnh sau : 14 12 17 13 15 right Sinh viên thực hiện:Nguyễn Hải Nam 41 left hocthuat.vn –Tài liệu online miễn phí Đến right < left, ta dừng lại, trao đổi A[0] với A[4] ta thu đƣợc phân hoạch với k = right = 14 12 17 13 15 k Phân tích xếp nhanh Chúng ta cần đánh giá thời gian chạy T(n) thuật toán xếp nhanh mảng A[a b] có n phần tử, n = b – a + Trƣớc hết ta cần đánh giá thời gian thực hàm phân hoạch Thời gian phân hoạch thời gian qua mảng (hai biến left right chạy từ hai đầu mảng chúng gặp nhau), vị trí mà left right chạy qua ta cần so sánh thành phần vị trí với mốc trao đổi cần thiết Do phân hoạch mảng n phần tử ta cần thời gian O(n) Thời gian trường hợp tốt Trƣờng hợp tốt xảy mà sau lần phân hoạch ta nhận đƣợc hai mảng Trong trƣờng hợp này, từ hàm đệ quy QuickSort, ta suy quan hệ đệ quy sau : T(1) = O(1) T(n) = T(n/2) + O(n) với n > Đây quan hệ đệ quy mà ta gặp phân tích xếp hòa nhập Nhƣ trƣờng hợp tốt thời gian chạy QuickSort O(n logn) Thời gian trường hợp xấu Trƣờng hợp xấu trƣờng hợp mà sau lần phân hoạch mảng n phần tử ta nhận đƣợc mảng n – phần tử phía mốc, phía phần tử (Dễ thấy trƣờng hợp xẩy ta phân hoạch mảng đƣợc sắp) Khi ta có quan hệ đệ quy sau : Sinh viên thực hiện:Nguyễn Hải Nam 42 hocthuat.vn –Tài liệu online miễn phí T(1) = O(1) T(n) = T(n – 1) + O(n) với n > Ta có : T(1) = C T(n) = T(n – 1) + nC với n > Trong C số Bằng cách lặp ta có : T(n) = T(1) + 2C + 3C + … + nC n = C  i = Cn(n+1)/2 i 1 Do trƣờng hợp xấu nhất, thời gian chạy xếp nhanh O(n2) Thời gian trung bình Bây ta đánh giá thời gian trung bình Ttb(n) mà QuickSort đòi hòi để xếp mảng có n phần tử Giả sử mảng A[a b] chứa n phần tử đƣợc đƣa vào mảng cách ngẫu nhiên Khi hàm phân hoạch Partition(A, a, b, k) cho hai mảng A[a k – 1] A[k + b] với k số từ a đến b với xác suất nhƣ 1/n Vì thời gian thực hàm phân hoạch O(n), từ hàm QuickSort ta suy quan hệ đệ quy sau : n Ttb(n) = n Ttb(n) = n  k 1 [ Ttb(k - 1) + Ttb(n - k)] + O(n) Hay n  k 1 [ Ttb(k - 1) + Ttb(n - k)] + nC Trong C số Chú ‎ý Sinh viên thực hiện:Nguyễn Hải Nam 43 (1) hocthuat.vn –Tài liệu online miễn phí n  k 1 n Ttb(k - 1) =  k 1 Ttb(n - k) Do viết lại (1) nhƣ sau : n Ttb(n) =  n Ttb(k - 1) + nC k 1 (2) Trong (2) thay n bới n – ta có : n 1 n1 Ttb(n - 1) =  Ttb(k - 1) + (n – 1)C k 1 (3) Nhân (2) với n, nhân (3) với n – trừ cho ta nhận đƣợc n Ttb(n) = (n + 1) Ttb(n - 1) + (2n – 1)C Chia đẳng thức cho n(n + 1) ta nhận đƣợc quan hệ đệ quy sau : Ttb (n) n1 = Ttb (n - 1) n + 2n - n ( n1) C (4) Sử dụng phép lặp, từ (4) ta có Ttb (n) n1 = Ttb (n - 1) n = Ttb (n - 2) n1 2n - n ( n1) C + + 2n - ( n 1) n 2n - + n ( n1) C Ttb (n) n1 = Ttb (1) n + c 2i   i(i  1) i 1 Ta có đánh giá Sinh viên thực hiện:Nguyễn Hải Nam 44 (5) hocthuat.vn –Tài liệu online miễn phí 2i  ≤  k 1 i (i  1) n n n dx ≤ 2 ≤ 2logn  x i 1 i Do từ (5) ta suy Ttb (n) n1 hay = O(logn) Ttb(n) = O(n logn) Trong trƣờng hợp xấu nhất, QuickSort đòi hỏi thời gian O(n 2), nhƣng trƣờng hợp xảy Thời gian trung bình QuickSort O(n logn), thời gian trƣờng hợp xấu MergeSort O(n logn) Tuy nhiên thực tiễn cho thấy rằng, phần lớn trƣờng hợp QuickSort chạy nhanh thuật toán xếp khác 3.4 SẮP XẾP SỬ DỤNG CÂY THỨ TỰ BỘ PHẬN Trong mục trình bày phƣơng pháp xếp sử dụng thứ tự phận (heapsort) Trong mục 10.3, biết thứ tự phận n đỉnh biểu diễn mảng A[0 n-1], gốc đƣợc lƣu A[0], đỉnh đƣợc lƣu A[i], đỉnh trái (nếu có) đƣợc lƣu A[2*i + 1], đỉnh phải có đƣợc lƣu A[2*i + 2] Mảng A thoả mãn tính chất sau (ta gọi tính chất heap): A[i].key = A[n-1].key Trong trình trên, sau lần trao đổi A[0] với A[m] (với m=n1,…,1), ta nhận đƣợc mảng A[0…m-1] thoả mãn tính chất heap với i >= 1, trừ i = Điều có nghĩa nhị phân đƣợc biểu diễn mảng A[0 m-1] thoả mãn tính chất thứ tự phận, trừ gốc Để trở thành thứ tự phận, ta cần đẩy liệu lƣu gốc xuống vị trí thích hợp cây, cách sử dụng hàm ShiftDown (Xem mục 10.3.3) Còn vấn đề cần giải quyết, biến đổi mảng cần xếp A[0 n-1] thành mảng thoả mãn tính chất heap Điều có nghĩa ta phải biến đổi nhị phân đƣợc biểu diễn mảng A[0 n-1] thành thứ tự phận Muốn vậy, với i chạy từ n/2-1 giảm xuống 0, ta cần sử dụng hàm SiftDown để đẩy liệu lƣu đỉnh i xuống vị trí thíc hợp Đây cách xây dựng thứ tự phận mà trình bày 10.3.2 Bây ta viết lại hàm ShiftDown cho thích hợp với sử dụng thuật toán Giả sử mảng A[a b] (a < b) thoả mãn tính chất heap với i >= a+1 Hàm ShiftDown(a,b) sau thực việc đẩy A[a] xuống vị trí thích hợp mảng A[a b] để mảng thoả mãn tính chất heap với i >= a void ShiftDown(int a, int b) { int i = a; int j = * i + 1; while (j { for (int i = n / – ; i >= ; i ) ShiftDown(i,n-1); //Biến đổi mảng A[0 n-1] // thành mảng thoả mãn tính chất heap for (int i = n – ; i >= ; i ) { swap(A[0],A[i]); ShiftDown(0,i - 1); } } Phân tích HeapSort Thời gian thực lệnh lặp (1) thời gian xây dựng thứ tự phận mà xét mục 10.3.2 Theo chứng minh đƣa 10.3.2, lệnh lặp (1) đòi hỏi thời gian O(n) Trong lệnh lặp (2), số lần lặp n-1 Thân vòng lặp (2), với i = n-1 swap(A[0],A[n - 1]); ShiftDown(0,n - 2); Đây lệnh thực DeleteMin thứ tự phận đƣợc biểu diễn mảng A[0 n-1], liêụ có khoá nhỏ đƣợc lƣu vào A[n-1] Trong Sinh viên thực hiện:Nguyễn Hải Nam 47 hocthuat.vn –Tài liệu online miễn phí mục 10.3.1, ta chứng tỏ DeleteMin cần thời gian O(logn) Nhƣ thân lệnh lặp (2) cần thời gian nhiều O(logn) Do lệnh (2) cần thời gian O(nlogn) Vì vậy, thời gian thực HeapSort O(nlogn) Sinh viên thực hiện:Nguyễn Hải Nam 48 [...]... sắp xếp lại các thành phần của mảng A sao cho: A[0].key

Ngày đăng: 11/06/2016, 12:14

Từ khóa liên quan

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

Tài liệu liên quan