Đến nội dung

Hình ảnh

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
Chủ đề này có 5 trả lời

#1
ngocnguyen

ngocnguyen

    Lính mới

  • Thành viên
  • 3 Bài viết

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ỹ
  • 3921 Bài viết

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 Bài viết

 

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 Bài viết


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 Bài viết


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 Bài viết

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 à!!






0 người đang xem chủ đề

0 thành viên, 0 khách, 0 thành viên ẩn danh