1 [Hướng dẫn]Tóm tắt các thuật toán sắp xếp Wed Jun 29, 2011 10:55 am
Admin
Quản trị viên
Bài tập sắp xếp là 1 trong 5 câu, bài bắt buộc có trong bài thi.
Để giải quyết, tốt nhất hãy học thuộc. Ở đây tóm tắt lại để dễ nhớ. Cho dãy M từ X1, X2, X3...Xn thực hiện sắp xếp không giảm.
1)
6)
Nếu có gì cần điều chỉnh xin ý kiến để điều chỉnh đưa vào mục Bài chuẩn.
Để giải quyết, tốt nhất hãy học thuộc. Ở đây tóm tắt lại để dễ nhớ. Cho dãy M từ X1, X2, X3...Xn thực hiện sắp xếp không giảm.
1)
- Giải thuật sắp xếp chọn:
FOR i = 1 to n - 1 DO
1) k = i;
FOR j := i + 1 TO n DO
IF Xi < Xk THEN k := j
2) IF k ≠ j THEN Đổi_chỗ (Xk, Xj)
- Giải thuật sắp xếp nổi bọt:
FOR i := 1 TO n - 1 DO
FOR j := n DOWNTO i + 1 DO
Xj < Xj-1 THEN Đổi_chỗ (Xj, Xj-1)
- Giải thuật sắp xếp chèn:
FOR i := 2 TO n DO
1) tg : = Xi
j := i - 1
2) WHILE (Xj > tg) & (j > 0) DO
a) Xj+1 := Xj
b) j := j - 1;
3) Xj+1 = tg
- Giải thuật sắp xếp hoà nhập:
Proc HN1(A:mảng; var Z:mảng; var a,c,b)
{ở đây ta dùng mảng z để lưu trữ các phần tử đã được sx, c là chỉ số giữa của mảng A: c= (a + b) / 2}
{ta chia mảng A ra thành 2 mảng con [a...c] và [c + 1 ...b] }
1. i := a; j := c + 1; k := 0;
{i:duyệt trên [a..c]; j: duyệt trên [c+1...b]; k: duyệt trên mảng Z}
2. {so sánh các phần tử của hai mảng con với nhau}
WHILE (i ≤ c) & (j ≤ b) DO
a. IF A[i] < A[j] THEN Z[k]: = A[i]; i ++;
ELSE Z[k]: = A[j]; j ++;
b. k ++;
3. IF i > c THEN
FOR l := j TO b DO Z[l+k-j] : = A[l];
ELSE
FOR l := i TO c DO Z[l+k-i] : = A[l];
4. End.
Proc HOA_NHAP(var A: dãy số; d,c: chỉ số);
IF d < c THEN
1. m : = (d + c) / 2;
2. HOA_NHAP(d, m); HOA_NHAP(m + 1, c);
3. HN1(A, a, c, c + 1, b, Z);
4. FOR t: = d TO c DO A[t]: = Z[t];
End.
- Mô phỏng sắp xếp hoà nhập:
[You must be registered and logged in to see this image.]
- Giải thuật sắp xếp phân đoạn:
Proc QUICK_SORT (l, k: chỉ số trên dưới)
1. temp ; Xk; i = l; j = k;
2. WHILE i ≤ j DO
a. WHILE (i ≤ j) & Xi ≤ temp DO i ++
b. WHILE (i ≤ j) & Xj ≥ temp DO j--
c. IF i < j THEN Đổi_chỗ (Xi, Xj)
3. Đổi_chỗ (Xk, Xj)
4. QUICK_SORT (l, j - 1);
QUICK_SORT ( j+1, k)
End
6)
- Giải thuật sắp xếp vun đống:
- Proc VĐ1(i: byte; key: integer; m: byte);
{- sx trên mảng A[1...n]; key: giá trị khoá để so sánh; m: chỉ số của nút}
var: k,j: integer; Stop:boolean;
1. {gán k vào giá trị của Root}
a. stop:=false;
b. k: = i;
2. WHILE (2*k ≤ m) & !stop DO
a. j := 2 * k;
b.IF (j < m) & ( Xj < Xj+1) THEN j := j + 1;
c.IF key < Xj THEN Xk := Xj ; k := j;
ELSE Xk:=key;
3. End.
Proc Heap_Sort(n:byte);
var max, i, m:integer;
1. FOR i : = n/2 DOWNTO 1 DO VĐ1(i, xi, n);
2. FOR m := n - 1 DOWNTO 1 DO
a. max:=X[1];
b. VĐ1(1, max, m);
c. m := max;
3. End.
Nếu có gì cần điều chỉnh xin ý kiến để điều chỉnh đưa vào mục Bài chuẩn.