Issuu on Google+

1.1 CÁC PHƯƠNG PHÁP SẮP XẾP Phát biểu bài toán: Cho tập N phần tử có m thuộc tính, được biểu diễn dưới dạng bản ghi. Dựa vào một hoặc một vài thuộc tính để sắp xếp các đối tượng theo một trật tự mới. Bài toán sắp xếp gồm hai bài toán con : ể Dựa theo khoá sắp xếp để định vị lại thứ tự các bản ghi ể Chuyển các đối tượng về vị trị mới Bài toán hai chi là bài toán đổi chỗ thông thường, ta coi như đã giải được.Ta quan tâm đến bài toán một. Trong thực tế rất nhiều thuộc tính để sắp xếp một đối tượng, tuy nhiên ta cũng có thể xem thuộc tính làm khoá có kiểu dữ liệu nguyên. Khi đó ta có bài toán như sau: Cho dãy a1, ... aN là dãy các số nguyên. tìm cách sắp xếp dãy số đó theo thứ tự tăng dần. Sau đây ta tiến hành giải bài toán này. Qua việc trình bày các phương pháp sắp xếp. 1.1.1 Lựa chọn đơn giản (SelectionSort) í tưởng: Đi qua nhiều lần danh sách hay mỗi phần tử của nó, và cứ mỗi lần đi qua có một phần tử được sắp xếp đúng vị trí. Cấu trúc dữ liệu: Thuật toán được cài đặt trên cơ sở mảng. Dùng biến phụ smallpos để lưu vị trí của phần tử bé nhất và smallest lưu giá trị của phần tử nhỏ nhất. Giải thuật: Begin For i:=1 to n-1 do Begin SmallPos :=i; Smallest := X[Smallpos]; For j:= i+1 to n do If X[j] < Smallest then Begin SmallPos :=j; Smallest:=X[SmallPos]; End; X[SmallPos]:=X[i]; X[i]:=Smallest; End; End;


Lệnh 1 ..7: Chọn phần tử nhỏ nhất trong danh sách con X[i]... X[n] Lệnh 8...9: Chuyển phần tử nhỏ nhất này về đầu danh sách. Độ phức tạp: ể O(n2) ể (n-1) + ( n-2) + ... + 2+1 = n(n-1)/2 So sánh: Phương pháp này tồi nhất trong 3 phương pháp sắp xếp cơ bản. 1.1.2 Sắp xếp nổi bọt (BubbleSort) í tưởng: Đi qua nhiều lần danh sách và các danh sách con. Thực hiện hoán vị các cặp phần tử khác nhau. Mỗi cặp phần tử được hoán vị nếu chúng không có thứ tự đúng. Sau mỗi lần duyệt danh sách phần tử lớn nhất (hoặc nhỏ nhất) sẽ nằm ở cuối (hoặc đầu) danh sách. Và ở lần duyệt tiếp theo phần tử này không phải xét đến nữa.

Cấu trúc dữ liệu: Thuật toán được cài đặt trên cơ sở mảng, dùng biến tg để lưu trữ tạm thời khi hoán vị giữa hai phần tử. Dùng biến Numpairs lưu số cặp được so sánh trong lần đi qua hiên thời và biến Last lưu vị trí cuối cùng đã cần phải hoán vị. Giải thuật: Begin Numpairs:= n-1; Last:=1; Repeat For i:=1 to NumPairs do If X[i] > X[i+1]then Begin Tg:=X[i]; X[i]:=X[i+1]; X[i+1]:=tg; Last:=i; End; NumPairs:= Last –1; Until Numpairs =0;


End;

Độ phức tạp: ể Tồi nhất khi dãy có thứ tự ngược lại ể Gồm (n-1) + (n-2) +... + 2 +1 = n(n-1)/2 ể O(n2) So sánh: Đứng hàng thứ hai trong 3 phương pháp sắp xếp cơ bản.

1.1.3 Sắp xếp chèn (InsertionSort) í tưởng: Ban đầu ta coi như danh sách gồm một phần tử được sắp xếp đúng. Ta lần lượt tiến hành chèn các phần tử tiếp theo vào danh sách này sao cho danh sách luôn được sắp thứ tự đúng. Cấu trúc dữ liệu: Thuật toán được cài đặt trên cơ sở mảng. Vị trí 0 của mảng chứa một giá trị cầm canh nhỏ hơn mọi phần tử trong danh sách để để không rơi “ rơi sang bên trái” trong những lần duyệt danh sách từ phải . Giải thuật: Begin X[0]:= -1000000; For i =2 to n do NextElement:=X[i]; J:=i-1; While NextElement <X[j] do Begin X[j+1]:=X[i]; J:=J - 1; End; X[j+1]:=NextElement; End;

Độ phức tạp : ể Trường hợp xấu nhất khi dãy có thứ tự ngược lại. Khi đó ta phải so sánh x(2) với x(1),x(0); x(3) với x(2),x(1),x(0)....Số phép toán so sánh là 2+3+ ...+n = n(n+1)/2 –1.


ể Đô phức tạp O(n2) (Trường hợp trung bình) So sánh : Tốt nhất trong 3 phương pháp cơ bản .Tối ưu khi số phần tử trong phạm vi 15 ... 20.


Quick sort