前段時間幫助乙個同學完成了一道visual foxpro的排序演算法作業題,在此記錄一下。
一、題目要求:
程式先要求使用者輸入n個數,最後依次輸出原始輸入數列、從小到大排列後的數列、從大到小排列後的數列、兩端大中間小排列後的數列。
二、程式**:
clear
numcount = 0
input " 請輸入需要排序的n個數:" to numcount
if numcount<1
? " 輸入的資料個數必須大於0!"
return
endif
dime numarr(numcount)
* accept numbers from keyboard
for i=1 to numcount
input " 請輸入第"+alltrim( str(i) )+"個數:" to numarr(i)
endfor
* print orginal numbers
? " 原始輸入數列:"
for i=1 to numcount
?? alltrim( str( numarr(i) ) ) + " "
endfor
* sort the array
for curindex = 2 to numcount
curdata = numarr( curindex )
sortedminindex = 1
sortedmaxindex = curindex - 1
* query the positon that the curdata should put in
do while sortedminindex <= sortedmaxindex
midindex = ( sortedminindex + sortedmaxindex ) / 2
if numarr( midindex ) < curdata
sortedminindex = sortedminindex + 1
else
sortedmaxindex = sortedmaxindex - 1
endif
enddo
*move data forward index from sortedminindex
for j = curindex - 1 to sortedminindex step -1
numarr( j+1 ) = numarr( j )
endfor
* put curdata to its position
numarr( sortedminindex ) = curdata
endfor
* print data from min to max
? " 從小到大排序:"
for i = 1 to numcount
?? alltrim( str( numarr(i) ) ) + " "
endfor
* print data from max to min
? " 從大到小排序:"
for i = numcount to 1 step -1
?? alltrim( str( numarr(i) ) ) + " "
endfor
* print from both ends to center
? " 兩端大中間小:"
for i = numcount to 1 step -2
if i>0
?? alltrim( str( numarr(i) ) ) + " "
endif
endfor
if i=0
startindex = 1
else
startindex = 2
endif
for i = startindex to numcount step 2
if i <= numcount
?? alltrim( str( numarr(i) ) ) + " "
endif
endfor
三、程式設計思路:
首先,我們要用乙個陣列來接收使用者輸入的原始資料。根據使用者指定的資料個數來定義陣列維數,並逐個接收使用者輸入的資料儲存到陣列裡。使用者輸入資料完畢,即可列印原始數列。
為了實現資料的從大到小、從小到大以及兩頭大中間小的排序,首先就要將該陣列從小到大遞增排序,然後實現另外兩種排序就相對簡單了。
對原始序列進行排序的方法很多,有氣泡排序、選擇排序、希爾排序及插入排序等,這裡選擇使用插入排序演算法。
總體的思路是假設已經有乙個已經排序過的序列,向該序列中插入乙個新的資料,新資料放在這個已經排序的序列中適當的位置,保證插入新資料後的序列還是乙個有序序列。
對於乙個長度為n的原始序列a [1],a[2],…a[n],我們可以認為第乙個資料a[1]是有序的(即這個有序序列只包含乙個資料a[1]),這時我們將原始序列中第2個資料a[2]插入這個只包含乙個資料的有序序列中,並保證插入後的序列「a[1],a[2]」仍然是有序的。至此,原始序列可以分為已排序和未排序的兩個部分,第1個及第2個資料「a[1],a[2]」是有序的,第3個至第n個資料「a[3],a[4],…a[n]」仍然是未排序的。這時我們繼續將第3個資料a[3]插入到有序序列中(包含第1個資料和第2個資料的序列「a[1],a[2]」)並保證插入後第1至第3個資料「a[1],a[2],a[3]」是有序的。依此類推,直到第n個資料插入到由第1個至第n-1個資料組成的 有序序列「a[1],a[2],…a[n-1]」中,並保證插入後這個n個資料都是有序的。
一般的,假設序列中第1個至第i( 1<=ia[m],則繼續將a[i+1]與「a[m+1]…a[n]」的中間資料進行比較,反之則與「a[1]…a[m-1]」的中間資料進行比較。依次類推,直至最終找到a[i+1]的位置。
在進行a[1]…a[n]的排序後,就可以按1..n的順序列印出遞增數列及按從n…1的序列列印出遞減數列。
為了列印出兩頭大中間小的序列,分兩步列印。第一步從n..1的順序間隔列印,即列印a[n]、a[n-2]、a[n-4]… a[3]、a[1]。(如果n是偶數則列印a[n]、a[n-2]、a[n-4]… a[4]、a[2])。第二步從1…n的順序間隔列印a[2]、a[4]…a[n-1](如果n是偶數則列印a[1]、a[3]、…a[n-1])。
四、 程式分析
1. 將使用者輸入的「資料個數」儲存到變數numcount,宣告乙個長度為numcount的陣列numarr,依次接收使用者輸入的資料儲存到陣列numarr裡。
2. 用乙個迴圈輸出陣列numarr裡的所有資料,即輸出使用者輸入的原始數列。
3. 對陣列numarr進行遞增排序。從第2個資料開始至最後乙個資料迴圈插入到前面已經排序的數列中。
1) curindex 為當前迴圈中待插入的資料,即到此迴圈時,第1個到curindex-1個資料是已經排序的;sortedminindex和sortedmaxindex為已經排序的序列的最小和最大的索引;
2) 用折中查詢法在已經排序的數列中找到第curindex個資料應該存放的位置(即最終sortedminindex所在的位置);
3) 將sortedminindex的到curindex-1的資料依次後移;
4) 將curindex所在位置的原來資料放到sortedminindex位置上,從而達到從1到curindex的資料都是排序過的目的。
4.將已經排序的陣列numarr從1到numcount的順序輸出,即輸出從小到大的數列;
5.將已經排序的數足從numcount到1 的順序輸出,即輸出從大到小的數列;
6.輸出兩頭大中間小的數列:
1)從numcount到1的順序間隔輸出數列,既迴圈變數i的步長為-2。
2) 第一步輸出完畢後,最後乙個輸出的資料只能是numarr陣列的第乙個資料或第二個資料,即迴圈終止後i的值是-1或0。如果i是0,則第一步最後輸出的是numarr的第2個資料,本次輸出應該從第1個資料開始;否則上次最後輸出的是numarr的第1個資料,本次迴圈應該從2個資料開始輸出。且本次迴圈直到numcount間隔輸出。
4 如何隱藏Visual FoxPro的主視窗
4 如何隱藏visual foxpro的主視窗 難度係數 人氣指數90 在程式編譯後啟動時,總是首先顯示visual foxpro的主視窗,然後才執行所設計的應用程式 這樣顯得非常不美觀,誰都不想在顯示自己程式的畫面時,後面還帶有乙個visual foxpro的主視窗,那如何來隱藏visual fo...
乙個乙個的輸入資料
有兩個需要注意的點 1.while中的內容 whlie ch getchar 0 ch eof 注意這兩個書寫的形式是不一樣的 2.while中就不用再寫getchar了,因為while中本身就有ch getchar 輸入描述 一行,字串行,包含a或b,輸入以字元0結束。輸出描述 一行,乙個字元,a...
乙個決定,乙個轉折
距離2012年9月已經是第四個年頭,對於我,我想這是我這輩子做的第一件我很自豪,很開心的乙個決定,從生物轉向計算機,一直以來,我對自己的期望總是很高,比如說上高中的時候,希望自己至少考個二本,學習個自己喜歡的專業,然後為之奮鬥,有乙個非常激動人心的大學四年,再比如說以後賺很多很多錢,擁有屬於自己的公...