Insertion Sort và Quick Sort

11 1.5K 1
Insertion Sort và Quick Sort

Đ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

QuickSort chia mảng thành hai danh sách bằng cách so sánh từng phần tử của danh sách với một phần tử được chọn được gọi là phần tử chốt

PHẦN A: NỀN TẢNG LÝ THUYẾT Mô tả chức yêu cầu 1.1 Khái quát xếp: Để thuận tiện giảm thiểu thời gian thao tác mà đặc biệt để tìm kiếm liệu dễ dàng nhanh chóng,thong thường trước thao tác liệu mảng,trên tập tin có thứ tự.Do thao tác xếp liệu thao tác cần thiết thường gặp trình lưu trữ,quản lý liệu Có nhiều cách xếp liệu,nhưng ta quan tâm đến thuật toán xếp phương pháp chèn (Insertion Sort) xếp dựa phân hoạch (Quick Sort).Ta phân tích hai thuật tốn xếp để so sánh đánh giá độ phức tạp chúng 1.2 Mục tiêu toán: Phân tích,đánh giá so sánh độ phức tạp(trên lý thuyết) so sánh thời gian tính tốn(trên thực nghiệm) giải thuật Đánh giá độ phức tạp giải thuật xếp phương pháp chèn(Insertion Sort) 2.1 Ý tưởng thuật tốn: Giả sử ta có dãy a1, a2, …, an i phần tử a1, a2, …, có thứ tự Ý tưởng thuật tốn tìm vị trị thích hợp chèn phần tử ai+1 vào dãy có thứ tự để có dãy có thứ tự Cứ thế, làm đến cuối dãy ta dãy có thứ tự Với dãy ban đầu a1, a2, …, an ta coi đoạn có phần tử a1 đoạn có thứ tự, sau ta chèn phần tử a2 vào dãy a1 để có dãy a1a2 có thứ tự Tiếp đó, ta lại chèn phần tử a3 vào dãy a1a2 để có dãy a1a2a3 có thứ tự Cứ thế, đến cuối ta chèn phần tử an vào dãy a1a2…an-1 ta dãy a1a2…an có thứ tự Insertion Sort Quick Sort Trang 2.2 Cài đặt thuật toán void insertionsort(int a[],int n) { int pos,x; for(int i=0;i=0 && a[pos]>x) { a[pos+1]=a[pos]; pos ; } a[pos+1]=x; } } 2.3 Đánh giá độ phức tạp: Ta thấy phép so sánh xảy vịng lặp nhằm tìm vị trí thích hợp pos để chèn x Mỗi lần so sánh mà thấy vị trí xét khơng thích hợp, ta dời phần tử a[pos] sang phải Ta thấy số phép gán số phép so sánh thuật tốn phụ thuộc vào tình trạng dãy ban đầu Do ta ước lượng sau: 2.3.1 Trường hợp tốt nhất: Dãy ban đầu có thứ tự Ta tìm vị trí thích hợp để chèn lần so sánh mà khơng cần phải vơ vịng lặp Như vậy, với i chạy từ đến n số phép so sánh tổng cộng n-1 Còn với số phép gán, thuật tốn khơng chạy vào vịng lặp nên xét i bất kỳ, ta phải tốn phép gán(x = a[i] a[pos] = x) Từ đây, ta tính số phép gán tổng cộng 2(n - 1) 2.3.2 Trường hợp xấu nhất:Dãy ban đầu có thứ tự ngược Ta thấy vị trí thích hợp pos ln vị trí dãy có thứ tự, Insertion Sort Quick Sort Trang đó, để tìm vị trí ta phải duyệt hết dãy có thứ tự Xét i bất kỳ, ta có số phép so sánh i-1, số phép gán (i - 1) + = i + Với i chạy từ đến n, ta tính số phép so sánh tổng cộng + + … + (n - 1) = n(n - 1)/2 số phép gán + + + (n + 1) = (n + 4)(n - 1)/2 Tổng kết lại, ta có độ phức tạp Insertion Sort sau:  Trường hợp tốt nhất: O(n)  Trường hợp xấu O(n2) Đánh giá độ phức tạp giải thuật xếp nhanh(Quick Sort) 3.1 Ý tưởng thuật toán: QuickSort chia mảng thành hai danh sách cách so sánh phần tử danh sách với phần tử chọn gọi phần tử chốt Những phần tử nhỏ phần tử chốt đưa phía trước nằm danh sách thứ nhất, phần tử lớn chốt đưa phía sau thuộc danh sách thứ hai Cứ tiếp tục chia tới danh sách có độ dài 3.2 Cài đặt thuật toán: void quicksort(int a[],int left,int right) { if(left>=right)return; int x=a[(left+right)/2]; int i=left; int j=right; { while(a[i]x)j ; if(i

Ngày đăng: 25/04/2013, 08:07

Từ khóa liên quan

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

Tài liệu liên quan