1. Trang chủ
  2. » Giáo Dục - Đào Tạo

sắp xếp bằng phương pháp chèn

18 382 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 371 KB

Nội dung

S¾p xÕp b»ng ph¬ng ph¸p chÌn Bài toán: Cho một mảng gồm một dãy các phần tử. Sắp xếp dãy đó theo qui tắc tăng dần. Ý tưởng: - Áp dụng theo phương pháp lên bài tú lơ khơ. Mỗi lá bài tương ứng với một phần tử của mảng. Lên từng lá bài một - lên lá bài thứ hai ta so sánh với lá bài thứ nhất - lên lá bài thứ ba so sánh với lá bài thứ hai và lá bài thứ nhất - Cứ như vậy ta sẽ được một dãy sắp xếp tăng dần. Thuật toán: Input: Một mảng A gồm các phần tử (khoá) chưa sắp xếp tăng dần. Output: Mảng A gồm các phần tử được sắp xếp tăng dần. S¾p xÕp b»ng ph¬ng ph¸p chÌn - Phép so sánh được tiền hành bắt đầu từ phần tử thứ 2. gán i ở pt thứ 2. Như vậy i chạy từ 2 đến n. Với mỗi một giá trị của i sẽ có j=i-1,i-2, ,i-i lần so sánh. Quá trình chèn xảy ra khi A[i]<A[j] và A[i]>A[j-1]. Như vậy để đảm bảo cho khoá mới trong mọi trường hợp kể cả khoá đầu tiên, ta thêm vào một khoá giả A[0] có giá trị nhỏ hơn tất cả các khoá trong mảng. Mảng A: 34 45 76 23 17 19 52 56 14 1 2 3 4 5 6 7 8 9 10 15 i j -∞ 0 Xác định biến: Như vậy số biến cần dùng là: i: chạy từ 2 đến n j: giảm từ i-1 cho đến i-i, dừng khi A[i]>A[j] x: nhận giá trị của A[i] để đem so sánh Thủ tục: Procedure Insertsort; var i,j,x:integer; Begin A[0]:= -∞ for i:=2 to n do Begin x:=A[i]; j:=i-1; while x<A[j] do Begin A[j+1]:=A[j]; j:=j-1; End; A[j+1]:=x; End; End; S¾p xÕp b»ng ph¬ng ph¸p chÌn Mảng A: 34 45 76 23 17 19 52 56 14 1 2 3 4 5 6 7 8 9 10 15 i j -∞ 0 S¾p xÕp b»ng ph¬ng ph¸p chÌn 67 3 34 2 i Mảng A: 1 42 j -∞ 0 Ví dụ: Cho mảng số nguyên gồm các pt: 42,34,67,45,23,65 ứng dụng thuật toán sắp xếp chèn hẵy sắp xếp cho dãy số trên. Chạy chậm: 42 34 34 2 i 1 34 j -∞ 0 42 i=2 i=3 x=34,j=1 34<42 -> x=67, j=2 67>42 -> A[j+1]:=x x=34,j=0 34> -∞ -> S¾p xÕp b»ng ph¬ng ph¸p chÌn i=4 i=5 67 3 34 2 i 1 34 j -∞ 0 42 x=45, j=3 45<67 -> A[j+1]:=A[j] -> x=45, j=2 45>42 -> A[j+1]:=x -> 45 4 6745 x=23, j=4 23<67 -> A[j+1]:=A[j] -> x=23, j=3 23<45 -> A[j+1]:=A[j] -> x=23, j=2 23<42 -> A[j+1]:=A[j] -> x=23, j=1 23<34 -> A[j+1]:=A[j] -> x=23, j=0 23> -∞-> A[j+1]:=x -> 23 5 67 3 34 2 i 1 34 j -∞ 0 42 6745 4 6745423423 Bài tập về nhà: Dùng ngôn ngữ lập trình Pascal, sử dụng thuật toán sắp xếp chèn sắp xếp dãy sau theo chiều giảm dần: 12,89,34,23,56,12 S¾p xÕp b»ng ph¬ng ph¸p chÌn i=6 x=65, j=5 65<67 -> A[j+1]:=A[j] -> x=65, j=4 65>45 -> A[j+1]:=x -> 67 3 34 2 i 1 23 j -∞ 0 34 4542 4 67 5 65 6 65 67 Bài toán: Cho một mảng k gồm n phần tử. Hãy sắp xếp các phần tử đó theo một qui định nào đó. Ý tưởng: Bước 1: Từ các phần tử của mảng tạo thành một cây nhị phân hoàn chỉnh, với mỗi nút có khoá tương ứng với giá trị của phần tử trong mảng. Bước 2: Tiến hành tạo thành đống ban đầu đối với các nút trên cây (Đống được hiểu là môt cây nhị phân hoàn chỉnh mà mỗi nút được gán giá trị khoá sao cho khoá ở nút cha bao giờ cũng lớn hơn khoá ở nút con nó). Bước 3: Sau quá trình tạo đống ta sẽ được một khoá có giá trị lớn nhất (gọi là khoá trội). Bước 4: Đưa khoá trội về vị trí n của cây. Bằng cách đổi vị trí với khoá hiện đang ở vị trí đó. Bước 5: Vun lại đống mới với số nút là n-i nút (i là số nút trội được loại bỏ). Quay lại Bước 4. S¾p xÕp b»ng ph¬ng ph¸p vun ®èng Ví dụ: Cho mảng gồm: 42 23 74 11 65 58 94 36 99 87 S¾p xÕp b»ng ph¬ng vun ®èng 42 1 2 23 4 11 8 36 9 99 10 87 5 65 6 58 7 94 3 74 1 2 3 4 5 6 7 8 9 10 87 36 94 58 7465 23 11 42 99 - Tạo thành đống ban đầu - Tạo cây nhị phân hoàn chỉnh: S¾p xÕp b»ng ph¬ng vun ®èng 1 2 3 4 5 6 7 8 9 10 87 42 36 94 58 7465 23 11 99 - Sắp xếp, loại bỏ khoá trội ra ngoài Thuật toán: Ta thấy: một nút lá luôn là một cây con thoả mãn điều kiện của đống. Như vậy tạo đống hay vun đống ta có thể tạo từ dưới lên. Đối với cây nhị phân hoàn chỉnh thì nút ứng với [n/2] trở xuống mới có thể là cha của các nút khác. Vì vậy khi tạo đống ta chỉ cần tạo từ nút [n/2] trở xuống. Input: Mảng k gồm các phần tử số nguyên Output: Sắp xếp lại các phần tử theo chiều tăng dần To hai th tc: th tc chnh cõy thnh ng v th tc sp xp li ng. procedure adjust(i,n:integer); var j,key:integer; begin key:=k[i]; while i*2<=n do begin j:=i*2; {Tìm cây con có giá trị lớn nhất} if (j<n)and(k[j]<k[j+1]) then j:=j+1; if k[j]<=key then break; k[i]:=k[j]; {Đổi chỗ Cha-Con} i:=j; end; k[i]:=key; {Đ5a khóa nút Cha về đúng vị trí} end; Sắp xếp bằng phơng vun đống 1 2 3 4 5 6 7 8 9 10 87 42 36 94 58 7465 23 11 99 [...]... adjust(i,n); for i:=n downto 2 do begin tg:=a[1];a[1]:=a[i];a[i]:=tg; adjust(1,i-1); end; Sắp xếp bằng phương vun đống Vớ d: Cho mng k gm cỏc phn t nguyờn: 23,67,90,89,12,95 Da vo thut toỏn sp xp vun ng hóy chy chm quỏ trỡnh sp xp theo chiu tng dn - To cõy nh phõn hon chnh 1 2 4 89 23 67 3 5 12 6 95 90 Sắp xếp bằng phương vun đống - To ng ban u for i:=3 down to 1 do call chinh(i,n); i=3 call chinh(3,6);... 67 3 key6 -> k[i]:=key 4 89 5 12 6 90 95 90 95 Sắp xếp bằng phương vun đống i=2 call chinh(2,6); key=k[i]=67; j=2*i=2*1 i*2 . nhất - Cứ như vậy ta sẽ được một dãy sắp xếp tăng dần. Thuật toán: Input: Một mảng A gồm các phần tử (khoá) chưa sắp xếp tăng dần. Output: Mảng A gồm các phần tử được sắp xếp tăng dần. S¾p xÕp b»ng. A: 1 42 j -∞ 0 Ví dụ: Cho mảng số nguyên gồm các pt: 42,34,67,45,23,65 ứng dụng thuật toán sắp xếp chèn hẵy sắp xếp cho dãy số trên. Chạy chậm: 42 34 34 2 i 1 34 j -∞ 0 42 i=2 i=3 x=34,j=1 34<42. -> 23 5 67 3 34 2 i 1 34 j -∞ 0 42 6745 4 6745423423 Bài tập về nhà: Dùng ngôn ngữ lập trình Pascal, sử dụng thuật toán sắp xếp chèn sắp xếp dãy sau theo chiều giảm dần: 12,89,34,23,56,12 S¾p xÕp b»ng ph¬ng ph¸p chÌn i=6 x=65,

Ngày đăng: 25/01/2015, 18:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w