Mờt vẾi cÌch s¾p xếp mảng.

Một phần của tài liệu Lập trình bằng Turbo Pascal part 3 pptx (Trang 25 - 28)

S¾p xếp lμ mờt trong nhứng bμi toÌn cÈ sỡ trong xữ lÝ thẬng tin. Tử d·y dứ liệu ban Ẽầu ch−a cọ thự tỳ, cần tiến hμnh s¾p xếp Ẽể nhận Ẽ−ùc d·y kết quả cọ thự tỳ tẨng (hoặc giảm) dần theo mờt tr−ởng khoÌ Ẽ−ùc chồn nμo Ẽọ. Bμi toÌn quy về s¾p xếp mờt mảng cÌc phần tữ thuờc kiểu cọ thự tỳ, vÝ dừ mảng sộ (thỳc, nguyàn)

D−ợi ẼẪy sé trỨnh bμy mờt sộ ph−Èng phÌp s¾p xếp rất trỳc quan vμ dễ hiểụ ưể xÌc ẼÞnh ta luẬn s¾p xếp Ẽể mảng kết quả cọ thự tỳ tẨng dần.

4.1 Ph−Èng phÌp Ẽỗi chố trỳc tiếp.

ý t−ỡng chÝnh cũa ph−Èng phÌp Ẽụng nh− tàn gồi cũa nọ. Ta thỳc hiện duyệt tửng cặp phần tữ cũa mảng, nếu cặp nμo ch−a Ẽụng thự tỳ cần cọ thỨ Ẽỗi chố hai phần tữ cho nhaụ Lặp lỈi việc nμy cho Ẽến khi mảng Ẽ−ùc s¾p Ẽụng thự tỳ.

4.1.1 MẬ tả

B−ợc 1: B¾t Ẽầu tử Ẽầu mụt phải a[n], xÐt cặp phần tữ cỈnh nhau a[n], a[n-1], Ẽỗi chố chụng cho nhau nếu sai thự tỳ. Nếu Ẽ· Ẽựng thự tỳ rổi thỨ thẬị Tiến thàm về trÌi mời vÞ trÝ, nghịa lμ xÐt cặp a[n-1], a[n-2]. Lặp lỈi phÐp kiểm tra vμ Ẽỗi chố tràn cho Ẽến khi tợi mụt trÌị

Sau b−ợc nμy phần tữ nhõ nhất sé ỡ vÞ trÝ 1.

B−ợc i: B¾t Ẽầu tử Ẽầu mụt phải a[n]. XÐt cặp phần tữ cỈnh nhau a[n], a[n-1], Ẽỗi chố chụng cho nhau nếu sai thự tỳ. Tiến thàm về trÌi mời vÞ trÝ, lặp lỈi phÐp kiểm tra vμ Ẽỗi chố tràn cho Ẽến khi tợi vÞ trÝ i.

Sau b−ợc nμy phần tữ nhõ thự i sé ỡ vÞ trÝ ị D·y con a[1], a[2], ... a[i] Ẽ· Ẽụng thự tỳ.

HỨnh ảnh: Nếu viết mảng theo chiều Ẽựng thμnh mờt cờt vμ b¾t Ẽầu tử d−ợi làn thỨ mối phần tữ mảng giộng nh− lμ cÌc bồt n−ợc nhẹ hÈn phải nỗi dần làn, nặng hÈn phải chỨm dần xuộng cho tợi Ẽụng mục trồng l−ùng cũa nọ. VỨ lé Ẽọ mμ ph−Èng phÌp nμy còn cọ tàn gồi lμ s¾p xếp kiểu nỗi bồt - Bubble sort.

4.1.2 Minh hoỈ.

Bảng d−ợi ẼẪy trỨnh bμy diễn biến qua tửng b−ợc việc s¾p xếp mảng ban Ẽầu gổm 8 sộ, xếp theo chiều dồc tử tràn xuộng trong cờt 0. Kết quả s¾p xếp sau cÌc b−ợc 1,2,3,4... Ẽ−ùc viết trong cÌc cờt tiếp theọ

B−ợc 0 1 2 3 4 5 6 7 44 06 06 06 06 06 06 06 55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18 42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94 4.1.3 Thũ từc chi tiết. for i:= 2 to n do for j:= n downto i do

if a[j-1] > a[j] then Ẽỗi chố a[j-1] cho a[j]

var i,j: integer; x: real;

begin for i:=2 to size-1 do

begin for j:= size downto i do if a[j-1] > a[j] then

begin x:=a[j-1]; a[j-1]:=a[j]; a[j]:=x; end

end end;

4.2 Ph−Èng phÌp chèn trỳc tiếp.

4.2.1 MẬ tả

Ph−Èng phÌp nμy giộng nh− ng−ởi chÈi bμi nhặt tửng quẪn Ẽ−ùc chia rổi chèn vμo Ẽụng chố trong phần bμi Ẽ· cầm tràn taỵ Cừ thể lμ: xuất phÌt tử Ẽầu d·y nguổn, lấy dần tửng phần tữ ra vμ chèn thàm vμo Ẽụng chố cũa nọ trong d·y ẼÝch.

ưể tiết kiệm chố, ta khẬng bộ trÝ d·y ẼÝch ra mờt nÈi khÌc mμ xếp ngay vμo phần bõ trộng tỈi Ẽầu d·y nguổn, do lấy dần tửng phần tữ rạ Nh−

vậy d·y ẼÝch vμ d·y nguổn luẬn liền nhau, cờng lỈi vẫn chì chiếm Ẽụng n

chố. B−ợc xuất phÌt: D·y nguổn D·y ẼÝch rống

B−ợc 1: Rụt phần tữ a[1] tử d·y nguổn xếp vμo d·y ẼÝch. VỨ d·y ẼÝch chì cọ 1 phần tữ a [1] nàn nọ Ẽ· ỡ Ẽụng vÞ trÝ theo thự tỳ cần s¾p xếp.

D·y ẼÝch D·y nguổn

a1

B−ợc i: Rụt phần tữ a[i] tử d·y nguổn chèn thàm vμo d·y ẼÝch sao cho Ẽụng chố cũa nọ. D·y ẼÝch gổm i phần tữ Ẽ· xếp Ẽụng thự tỳ.

D·y ẼÝch D·y nguổn

ai

Chèn vμo Ẽụng chố

Lặp cho Ẽến khi hết d·y nguổn, tực lμ cho Ẽến khi i = n, mảng Ẽ−ùc s¾p xếp xong. D·y ẼÝch D·y nguổn rống

4.2.2

4.2.3

Minh hoỈ

Bảng d−ợi ẼẪy trỨnh bμy diễn biến cũa quÌ trỨnh s¾p xếp mảng gổm 8 sộ theo thuật giải chèn trỳc tiếp nh− mẬ tả ỡ tràn. Dấu vỈch chÐo lμ vÌch ngẨn giứa d·y ẼÝch ỡ bàn trÌi vμ d·y nguổn ỡ bàn phảị

Xuất phÌt: 44 55 12 42 94 18 06 67 B−ợc 1: 44 / 55 12 42 94 18 06 67 B−ợc 2: 44 55 / 12 42 94 18 06 67 B−ợc 3: 12 44 55 / 42 94 18 06 67 B−ợc 4: 12 42 44 55 / 94 18 06 67 B−ợc 5: 12 42 44 55 94 / 18 06 67 B−ợc 6: 12 18 42 44 55 94 / 06 67 B−ợc 7: 06 12 18 42 44 55 94 / 67 B−ợc 8: 06 12 18 42 44 55 67 94 Thũ từc chi tiết. for i:=2 to size do begin x:= a[i];

"chèn x vμo Ẽụng cũa nọ trong d·y Ẽ· s¾p thỳ tỳ a[1] ... a[i-1]" end;

Chi tiết hÈn nứa thao tÌc "chèn x vμo Ẽụng chố cũa nọ trong d·y Ẽ· s¾p thỳ tỳ a[1] ... a[i-1]" nh− saụ So sÌnh x vợi phần tữ kề sÌt bàn trÌi, nếu

x bÐ hÈn thỨ dÞch sang trÌi mờt vÞ trÝ. Tiến dần về bàn trÌị Lặp lỈi cẬng việc nμy cho Ẽến khi x lợn hÈn phần tữ bàn trÌi thỨ dửng vỨ x Ẽ· tiến Ẽến Ẽụng vÞ trÝ cũa nọ.

- B¾t Ẽầu j:=i-1; so sÌnh x vợi a[j];

- Nếu a[j] > x tiến sang trÌi: j=j-1;

- Dửng khi gặp a[j] bÐ hÈn x, hoặc Ẽ· Ẽến mụt trÌị

j:=i-1;

while (x < a[j]) and (j>0) do

begin a[j+1]:= a[j]; j:= j-1; end;

a[j+1]:= x; { Ẽ· Ẽến chố cần chèn x vμo }

Cọ thể lμm ẼÈn giản Ẽiều kiện dửng trong cẪu lệnh While bÍng cÌch thàm phần tữ canh chửng vμo Ẽầu mụt trÌi, Ẽặt a[0] = x;

Tọm lỈi cọ thuật giải nh− saụ

begin

for i:=2 to size do

Một phần của tài liệu Lập trình bằng Turbo Pascal part 3 pptx (Trang 25 - 28)