算法與程序設計——選擇排序
[小組討論]選擇排序的實質是每次把一堆數據中的最小數移到某個位置,那么這樣的操作在規模為n的數組中會做多少次?
——n-1次,因為經過n-1次操作已經確定了第1到n-1個位置的次序,第n個位置也自然可以確定。
[小組討論]找出數組中的最小數用什么策略?
[復習鞏固]可以借助一個自定義的integer型變量min,用它記錄最小的一個數據的下標。
首先,不管實際情況如何,我們先假設數組中第1個元素為最小,于是有min=1,再把這個元素與從第2個元素開始的所有元素作比較,一旦有比d(min)更小的元素存在,則修改min變量值為新的較小元素下標。這樣,在d(min)經過了從第2個元素到最后一個元素的一一比較后,所得到min應該就是第1到n個元素中的選舉出來的最小元素下標了。
然后用類似的方法,把第2到n個元素中最小數選舉出來;把第3到n個元素中最小數選舉出來……
i←1:min←1:j←2
開始
j<n ?
d(j)<d(min) ?
min←j
y
y
n
………………
j=j+1
最后把每次選舉出來的結果依次輸出即可實現升序排列。
[學生完成第1遍處理過程的流程圖片斷]
[依據流程圖寫出代碼]
dim min as integer
dim j as integer
min=1
for j=2 to n
if d(j)<d(min) then min=j
next j
[小組討論]
在遍歷了一遍后如果發現第1-n個數中的最小數d(min),根據選擇排序的思想,需要把它與第1個數字進行交換。如何進行?
[請同學發言]打個比方,在廚房里有一瓶醬油、一瓶醋和一個空瓶,如何利用這個空瓶實現醬油與醋?
——可先把醬油倒到空瓶中,再把醋倒到原來裝醬油的瓶中,然后從原來的空瓶中把醬油倒到原來裝醋現在已經空的瓶中,即可實現換位。
[教師]大家動動腦筋,用這種思想,試試把d(1)與d(min)換位,并寫出相應的代碼。
dim temp as integer
temp = d(i):d(i)=d(min):d(min)=temp ’關鍵在于引入“空瓶”變量temp
[思考]是不是每遍歷一遍后必須做這樣的一次交換?
——不是必須的,只有當確實發現有比d(1)小的數后才交換
[教師]那怎么知道有沒有發現比d(1)更小的數呢?
i←1:min←1:j←2
開始
j<n ?
d(j)<d(min) ?
min←j
y
n
n
………………
min<>1 ?
temp = d(1)
d(1)=d(min)
d(min)=temp
y
j=j+1
——其實在遍歷之前我們已經假設第1個元素最小,即min=1,所以在遍歷一遍后我們只需要驗證一下min=1是否還成立。成立則表明沒有比第1個元素小的數,不成立則表明有比第1個元素小的數,且它的下標為min,此時要交換d(1)與d(min)。
[學生完善流程圖及代碼]
if min <> 1 then
temp = d(1):d(1)=d(min):d(min)=temp
end if
[教師]我們先前說過,對于規模為n的數組,需要遍歷處理次數為n-1次,以上的流程就是這n-1次中需要重復做的事,對于重復處理的事,可以用什么結構?
——循環,以上的比較、交換即為循環體
[教師]大家試著把這個循環結構流程圖畫出來
[學生完善流程圖及代碼]
開始
j<n ?
d(j)<d(min) ?
min←j
y
n
輸出排序結果
n
min<>i ?
temp = d(i)
d(i)=d(min)
d(min)=temp
y
i<=n-1
i←1
y
n
結束
i=i+1
j=j+1
min=i:j=i+1
for i = 1 to n-1
min = i
for j = i + 1 to n