Jump to content

Photo

lập trình pascal: sắp xếp dãy số nguyên bằng thuật toán tráo đổi


  • Please log in to reply
5 replies to this topic

#1
ngocnguyen

ngocnguyen

    Lính mới

  • Thành viên
  • 3 posts

cho số nguyên dương n(n<=250) và dãy a gồm n số nguyên dương a1, a2,..an, mỗi số đều k vượt quá 500. Sắp xếp dãy a thành dãy không giảm

a1.jpg

a2.jpg

giải thích dùm đoạn for j:=n downto 2 do trở xuống



#2
hxthanh

hxthanh

    Tín đồ $\sum$

  • Hiệp sỹ
  • 3922 posts

Thuật toán sắp xếp của bạn là kiểm tra và đổi chỗ 2 vị trí liền nhau nếu vị trí sau lớn hơn vị trí trước qua $n-1$ bước

Bước 1 kiểm tra và đổi chỗ $n-1$ cặp $(a_1, a_2);(a_2,a_3);..;(a_{n-1},a_n)$

Sau bước 1 thì $a_n$ là bé nhất

Bước 2 tương tự như vậy nhưng chỉ xét đến $a_{n-1}$

...

for j:=n downto 2 do        {Cái này lùi từ n về đến 2}
  for i:=1 to j-1 do        {Kiểm duyệt từ cặp 1 đến cặp j-1}
    if a[i]>a[i+1] then     {Phát hiện hai vị trí liên tiếp sắp xếp sai}
     begin
        t:=a[i];            {Lưu đệm}
        a[i]:=a[i+1];       {Cho a[i+1] lên vị trí a[i]} 
        a[i+1]:=t;          {Trả đệm vào vị trí a[i+1]}
     end;


#3
ngocnguyen

ngocnguyen

    Lính mới

  • Thành viên
  • 3 posts

 

Thuật toán sắp xếp của bạn là kiểm tra và đổi chỗ 2 vị trí liền nhau nếu vị trí sau lớn hơn vị trí trước qua $n-1$ bước

Bước 1 kiểm tra và đổi chỗ $n-1$ cặp $(a_1, a_2);(a_2,a_3);..;(a_{n-1},a_n)$

Sau bước 1 thì $a_n$ là bé nhất

Bước 2 tương tự như vậy nhưng chỉ xét đến $a_{n-1}$

...

for j:=n downto 2 do        {Cái này lùi từ n về đến 2}
  for i:=1 to j-1 do        {Kiểm duyệt từ cặp 1 đến cặp j-1}
    if a[i]>a[i+1] then     {Phát hiện hai vị trí liên tiếp sắp xếp sai}
     begin
        t:=a[i];            {Lưu đệm}
        a[i]:=a[i+1];       {Cho a[i+1] lên vị trí a[i]} 
        a[i+1]:=t;          {Trả đệm vào vị trí a[i+1]}
     end;

bạn ơi, cái này là sắp xếp thành dãy tăng dần mà bạn, thì an phải lớn nhất chứ, mình vẫn chưa hiểu tại sao lại lùi từ n về 2 và kiểm duyệt từ 1 đến j-1



#4
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 posts


bạn ơi, cái này là sắp xếp thành dãy tăng dần mà bạn, thì an phải lớn nhất chứ, mình vẫn chưa hiểu tại sao lại lùi từ n về 2 và kiểm duyệt từ 1 đến j-1

Cái bạn Hxthanh giải thích thế mình thấy chuẩn men rồi gì nữa, nếu bạn không hiểu, thì có thể sửa thuật toán lại thành :

 

For i:=1 to n-1 do

for j:=i+1 to n do

if a[i]>a[j] then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

end;

 

như thế là chạy sẻ dễ hiểu hơn rồi đó



#5
ngocnguyen

ngocnguyen

    Lính mới

  • Thành viên
  • 3 posts


Cái bạn Hxthanh giải thích thế mình thấy chuẩn men rồi gì nữa, nếu bạn không hiểu, thì có thể sửa thuật toán lại thành :

 

For i:=1 to n-1 do

for j:=i+1 to n do

if a[i]>a[j] then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

end;

 

như thế là chạy sẻ dễ hiểu hơn rồi đó

có lẻ dễ hiểu hơn rồi ,đa tạ bác



#6
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 posts

có lẻ dễ hiểu hơn rồi ,đa tạ bác

:v cả bác, mình mới học lớp 10 thôi à!!






1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users