VB程序設計

VB程序設計

VB6.0似乎已經成為開發(fā)者的往事频蛔,但是Microsoft Office系列軟件的控制和操作仍然是基于VB6.0的。本項目是為所有學習VB6.0的同學而建立的照雁。

問題1: 排序算法

排序算法是計算機程序設計中最經典的算法蚕愤,在計算機的專業(yè)課《數據結構》中有大量的討論和分析答恶。我們在這里只討論最簡單的選擇排序冒泡排序。討論從一個填空題開始萍诱。

' 功能:將數組a()中的元素按從小到大排序'
' 參數:數組a()的下標索引為從1到30'
Sub bubble_sort(a() As Integer)
    For i = 1 To 29
        For j = 【2】
            If a(i) > a(j) Then
                m = a(i): a(i) = a(j): a(j) = m
            End If
        Next j
    Next i
End Sub

問題:【2】這個地方應該填什么悬嗓?是 i+1 To 30?還是 1 To 30-i裕坊?

  • 首先包竹,最正確的姿勢是記住籍凝!甭管是冒泡還是選擇排序周瞎,這里j的取值應該與i正好錯開1,【2】處應該填:i+1 To 30
  • 其次饵蒂,理解排序的原理声诸。為什么不是:1 To 30-i呢?
    首先退盯,我們要明確目標彼乌。因為要對數組a()從小到大排序,我們期望:依次掃描a()中的每個元素渊迁,每掃描到一個元素a(i)慰照,都使得它是剩下的元素(從a(i)到a(30))中最小的。怎么做到呢宫纬?可以從a(i)一直掃描到a(30)焚挠,找到最小的元素a(p),令a(i)和a(p)的值交換(注意:這里不能直接讓a(i)=a(p)漓骚,否則蝌衔,a(i)的原有值就不見了)。用下面的偽代碼表示:
'代碼塊1
Sub selection_sort(a() As Integer)
    For i = 1 To 30
        '從a(i) 到 a(30)中找到最小的元素a(p)'
        '將a(i)和a(p)的值交換'
    Next i
End Sub

那么蝌蹂,怎么從a(i) 到 a(30)中找到最小的元素a(p)呢噩斟?可以這樣做:

'代碼塊2
p = a(i) '首先,假設a(i)就是最小的'
For j = i To 30 '從a(i) 掃描到 a(30)'
    If p > a(j) Then '一旦發(fā)現p比a(j)還大孤个,就讓p指向a(j)'
        p = a(j)
    End If
Next j

上述做法剃允,就是選擇排序的思想。我們可以將代碼優(yōu)化下:
首先齐鲤,j 不必從 i 開始掃描斥废,因為當 j = i 時,a(j)沒有必要跟a(p)進行比較(這時给郊,p 也等于 i)牡肉。
其次,p 指向a(i)的索引就可以了淆九,沒有必要指向a(i)统锤。

'代碼塊3
p = i ' 假設a(i)就是最小的
For j = i+1 To 30
    If a(p) > a(j) Then  '一旦發(fā)現a(p)比a(j)還大毛俏,就讓 p 指向 j
        p = j
    End If
Next j

這時,將代碼塊3嵌入代碼塊1饲窿,就可以得到完整的選擇排序的代碼了:

'代碼塊4
Sub selection_sort(a() As Integer)
    For i = 1 To 30
        '從a(i) 到 a(30)中找到最小的元素a(p)
        p = i '假設a(i)就是最小的
        For j = i+1 To 30
            If a(p) > a(j) Then '一旦發(fā)現a(p)比a(j)還大煌寇,就讓 p 指向 j
                p = j
            End If
        Next j
        '將a(i)和a(p)的值交換(代碼略)'
    Next i
End Sub
  • 經過上面的推演,我們就得到了一個雙重循環(huán)逾雄。反過來阀溶,如果直接拿到的就是這樣一個雙重循環(huán)的話,會不會感覺閱讀起來很困難嘲驾?實際上淌哟,只要把外層循環(huán) i 固定為某個特定的值來理解內層循環(huán) j 就可以了。
  • 再來看冒泡排序法辽故。它與選擇排序法最大的不同在于:在其內層循環(huán) j 中,一旦發(fā)現a(p)比a(j)還大腐碱,就讓 a(p) 和 a(j) 的值交換誊垢,而 p 是始終指向 i 的(因為a(p)中一直存放最小的值,所以症见,p就沒有必要再移動了)喂走。這樣,每經過一次內層循環(huán)谋作,就相當于剩下元素中具有最小值的那個元素(具有最小的質量)從水底下浮出來了芋肠,因此稱為“冒泡排序法”。具體代碼如下:
' 代碼塊5
Sub selection_sort(a() As Integer)
    For i = 1 To 30
        ' 從a(i) 到 a(30)中找到最小的元素a(p)
        ' 假設a(i)就是最小的遵蚜,并且始終存放剩余元素中的最小值
        For j = i+1 To 30
            If a(i) > a(j) Then '一旦發(fā)現a(i)比a(j)還大帖池,就讓它們交換
                m = a(i): a(i) = a(j) : a(j) = m
            End If
        Next j
    Next i
End Sub
  • 那么,上面的“選擇排序”和“冒泡排序”哪個更優(yōu)呢吭净?也就是睡汹,哪個排序算法的速度更快呢?顯然是選擇排序寂殉。因為冒泡排序在最壞的情況下需要 30-(i+1)+1=30-i 次 a(j) 和 a(i) 的交換囚巴,而選擇排序只要交換交換 1 次即可。
  • 再來看同學的問題友扰,同學嘗試將內層循環(huán) j 設置為 1 To 30-i 有什么問題呢彤叉?事實上,這樣做就意味著:該做的沒有做村怪,不該做的卻費力去做秽浇。第一,該做的沒有做实愚。你看兼呵,這樣做只能找到從a(1)到a(30-i)中的最小值兔辅,那a(30-i)之后的元素呢?第二击喂,不該做的卻費力去做维苔。為了讓 a(i) 為剩下元素中的最小值,還需要做許多冗余的工作:它還要跟它之前的已經比它還小的元素依次比較懂昂,這完全是沒有必要的介时,因為比它大的元素,只可能在它后邊凌彬。
  • 練習沸柔。如果我們非要將內層循環(huán) j 設置為 1 To 30-i 呢?如果非要這樣做铲敛,外層循環(huán) i 的設置必須改變褐澎,它必須從 a(i) 的最后一個元素倒著走向 a(i) 的第一個元素,以保證:每次a(i)中都存放最大值伐蒋。這樣的程序該如何寫工三?請同學們自行練習。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末先鱼,一起剝皮案震驚了整個濱河市俭正,隨后出現的幾起案子,更是在濱河造成了極大的恐慌焙畔,老刑警劉巖掸读,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異宏多,居然都是意外死亡儿惫,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門绷落,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥闪,“玉大人,你說我怎么就攤上這事砌烁】鹪” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵函喉,是天一觀的道長避归。 經常有香客問我,道長管呵,這世上最難降的妖魔是什么梳毙? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮捐下,結果婚禮上账锹,老公的妹妹穿的比我還像新娘萌业。我一直安慰自己,他們只是感情好奸柬,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布生年。 她就那樣靜靜地躺著,像睡著了一般廓奕。 火紅的嫁衣襯著肌膚如雪抱婉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天桌粉,我揣著相機與錄音蒸绩,去河邊找鬼。 笑死铃肯,一個胖子當著我的面吹牛患亿,可吹牛的內容都是我干的。 我是一名探鬼主播缘薛,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼窍育,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宴胧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤表锻,失蹤者是張志新(化名)和其女友劉穎恕齐,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體瞬逊,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡显歧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了确镊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士骤。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕾域,靈堂內的尸體忽然破棺而出拷肌,到底是詐尸還是另有隱情,我是刑警寧澤旨巷,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布巨缘,位于F島的核電站,受9級特大地震影響采呐,放射性物質發(fā)生泄漏若锁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一斧吐、第九天 我趴在偏房一處隱蔽的房頂上張望又固。 院中可真熱鬧仲器,春花似錦、人聲如沸仰冠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪停。三九已至煤辨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間木张,已是汗流浹背众辨。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舷礼,地道東北人鹃彻。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妻献,于是被迫代替她去往敵國和親蛛株。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序育拨,內部排序是數據記錄在內存中進行排序谨履,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,170評論 0 52
  • 概述:排序有內部排序和外部排序熬丧,內部排序是數據記錄在內存中進行排序笋粟,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,243評論 0 2
  • 總結一下常見的排序算法析蝴。 排序分內排序和外排序害捕。內排序:指在排序期間數據對象全部存放在內存的排序。外排序:指在排序...
    jiangliang閱讀 1,334評論 0 1
  • 參考博客: iOS開發(fā)~CocoaPods使用詳細說明 用CocoaPods做iOS程序的依賴管理 CocoaPo...
    abletyang閱讀 33,187評論 5 29