1樓:匿名使用者
i<>j是優化,這個不用說,很簡單。
至於begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;更簡單,這個幾乎排序都要有的交換過程。
這個temp過程是必要的。
因為你的a[i]已經被a[k] 賦值了,就是a[i]=a[k],反過來賦值沒有意義,打個比方,a杯子有果汁,b杯子裡有可樂,你要把果汁放進b裡,把可樂放進a裡,那麼必須有個c杯子先把a的果汁倒進c裡,然後吧b中的可樂倒進a中,然後再把c中的果汁到進b裡,而程式中temp就是充當這個c杯子的角色。
2樓:匿名使用者
此程式有錯誤。
如果輸入的資料是。
輸出的結果就是4 5 8 8 5 12 6 21 12 55並沒有成功排序。
而且這個程式執行效率似乎並不高。我在程式中新增了一個計數器變數x,經過統計,在排序過程中,大小數的交換上有45次之多。(以上述資料測試而得)
這是完整程式:
const n=10;
var x,i,j,k,temp:integer;
a:array [1..n] of integer;
beginfor i:=1 to n do readln(a[i]);
write('array:')
for i:=1 to n do write(a[i]:3);
readln;
x:=0;for i:=1 to n-1 do
begink:=i;
for j:=i+1 to n do
beginif a[k]>a[j] then k:=j;
if i<>j then
begintemp:=a[i];
a[i]:=a[k];
a[k]:=temp;
inc(x);
end;end;
end;write('after sort:')
for i:=1 to n do write(a[i]:3);
writeln;
writeln('jiaohuan:',x);
readln;
end.經過修改後,我的程式可以正確排序,並且交換次數只有12次。(仍以上述資料測試而得)
修改後的程式:
const n=10;
var x,i,j,k,temp:integer;
a:array [1..n] of integer;
beginfor i:=1 to n do readln(a[i]);
write('array:')
for i:=1 to n do write(a[i]:3);
readln;
x:=0;for i:=1 to n-1 do
begink:=i;
for j:=i+1 to n do
beginif a[k]>a[j] then
begintemp:=a[j];
a[j]:=a[k];
a[k]:=temp;
inc(x);
end;end;
end;write('after sort:')
for i:=1 to n do write(a[i]:3);
writeln;
writeln('jiaohuan:',x);
readln;
end.
3樓:要你命三千之趙
i<>j 優化程式撒,如果相等取的同一個數,就不用交換了a[k]:=temp;怎麼能不要呢?你還要用這個中間數繼續和下面沒排序的數進行比較呢。
你是雙迴圈啊,下面跑 for j:=i+1 to n dobegin
if a[k]>a[j] then k:=j;
if i<>j then
begintemp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;end;
這個迴圈的時候,k還沒賦值呢,跑玩一次迴圈,才變的。
pascal問題,pascal 問題
你錯在寫的程式太長了。program asfl vars string i,j,b longint a array 1.10 of longint begin readln s i 1 j 1 while ibegin inc i if s i then delete s,i,1 end for i...
求pascal精簡的堆排序演算法程式
孩子,用快排吧 這是最快的 程式1 program kspv const n 7 type arr array 1.n of integer vara arr i integer procedure quicksort var b arr s,t integer var i,j,x,t1 integ...
pascal問題,pascal是什麼?
pascal是什麼?pascal是一個多義詞,所代表的意思分別是 1 pascal指的是結構化程式語言 pascal的名稱是為了紀念十七世紀法國著名哲學家和數學家blaise pascal而來的,它由瑞士niklaus wirth教授於六十年代末設計並創立的。2 pasca指的是壓力的國際標準單位 ...