資源簡介 第2節 冒泡排序及程序實現考試內容考試要求冒泡排序算法思想c冒泡排序程序實現c一、冒泡排序算法思想什么是冒泡排序將n個數據看作豎向排列的一組數據,每趟排序自下而上對每對相鄰數據進行比較,若次序不符合要求就進行交換。每趟排序結束時都能使排序范圍內關鍵字最小的記錄像一個氣泡一樣升到上端的對應位置,整個排序過程共進行n-1趟,依次將關鍵字最小、次小……的各個數據冒到表的第一個、第二個……位置上。用冒泡排序對n個數據進行排序時,共需進行n-1趟排序,比較的總次數為。二、冒泡排序算法框架約定:對數組d中的n個數據進行升序排序。(1)從后往前進行比較For i = 1 To n - 1 ′n個數據進行排序,共需進行n-1趟 For j = n To i + 1 Step - 1 ′第i趟排序時If d(j) < d(j-1) Then ′符合條件則進行數據交換 交換數據元素d(j)與d(j-1)的值End If Next jNext i注:若要按降序排列,將程序中的語句“If d(j)d(j -1) Then”即可。(2)從前往后進行比較For i = 1 To n - 1 ′n個數據進行排序,共需進行n-1趟For j = 1 To n - i ′第i趟排序時If d(j) > d(j+1) Then ′符合條件則進行數據交換 交換數據元素d(j)與d(j+1)的值 End IfNext jNext i注:若要按降序排列,將程序中的語句“If d(j)>d(j+1) Then”改為“If d(j)三、冒泡排序程序實現約定:對數組d中的n個數據進行升序排序。(1)從后往前進行比較時程序如下:For i = 1 To n - 1 ′n個數排序共需進行n-1趟 For j = n To i + 1 Step -1 ′第i趟排序時 If d(j) < d(j - 1) Then ′若后面元素小于前面元素時進行交換 temp = d(j) d(j) = d(j - 1) d(j - 1) = temp End If Next jNext i(2)從前往后進行比較時程序如下:For i = 1 To n - 1 ′n個數排序共需進行n-1趟 For j = 1 To n - i ′第i趟排序時If d(j) > d(j + 1) Then ′若前面元素大于面元素時進行交換 temp = d(j) d(j) = d(j + 1) d(j + 1) = tempEnd If Next jNext i一、冒泡排序算法思想理解冒泡排序的基本思想,學會將待排數據按照冒泡算法思想進行手工模擬排序。【典例1】 使用冒泡排序對下表中9個數據進行排序,排序過程如下所示:初始數據1005080706035908525第1遍2510050807060359085第2遍2535100508070608590第3遍則第三遍的排序結果為( )A.25,35,50,60,100,80,70,85,90B.25,35,50,100,60,80,70,85,90C.25,35,50,100,80,70,60,85,90D.25,35,50,60,70,80,85,90,100解析 本題主要考查冒泡排序算法的基本思想。觀察第1、2遍的排序結果可知,該冒泡排序采用從后往前兩兩比較的方式進行升序排序,因此手工模擬可知,第3遍排序后的結果為25,35,50,100,60,80,70,85,90,答案為B。答案 B【變式訓練】 采用冒泡排序算法對數組a中的6個數據“5,4,51,16,9,30”進行排序,部分程序如下:For i=1 To 3 For j=6 To i+1 Step -1If a(j)>a(j-1) Then End If Next jNext i下列說法正確的是( )A.升序排序,實線框中的語句共執行了8次B.升序排序,實線框中的語句共執行了10次C.降序排序,實線框中的語句共執行了8次D.降序排序,實線框中的語句共執行了10次解析 本題主要考查的是冒泡排序。根據語句“If a(j)>a(j-1)Then”可知,排序方式為從大小到排序(降序),排序過程如下:初始數據545116930交換次數第1遍5154301694第2遍5130541692第3遍5130165492數據交換次數為4+2+2=8次,因此答案為C。答案 C【方法總結】 冒泡排序是通過相鄰數據兩兩比較,可以從前往后進行比較,也可以從后往前進行比較,通過If語句中表達式確定排序的升降性。二、冒泡排序算法實例應用【典例2】 某VB程序段如下:s = “ ”For i = 1 To 3For j = 7 To i + 1 Step -1If a(j) < a(j - 1) Then k = a(j): a(j) = a(j - 1): a(j - 1) = kEnd IfNext js = s + Str(a(i))Next iText1.Text = s數組元素a(1)到a(7)的初始數據依次為“3,9,1,5,8,6,2”,經過該程序段“加工”后,文本框Text1中顯示的內容是( ) A.1 2 3 B.9 8 6C.3 9 1 D.8 6 2解析 本題考查的是冒泡排序的算法實現。此題程序的功能是求3遍冒泡排序(升序)后數據序列中前三個數的情況,因此前三個數為1,2,3。答案 A【變式訓練】 使用冒泡排序對數組a中的數據進行排序,程序段如下:s = “ ”For i = 1 To 7For j = 1 To 8 - iIf a(j) < a(j + 1) Then k = a(j): a(j) = a(j + 1): a(j + 1) = kEnd IfNext jNext i數組元素a(1)到a(8)的初始數據依次為“11,8,21,15,18,16,2,30”,排序完成時,共進行數據交換的次數為( )A.9 B.10 C.11 D.12解析 本題考查的是冒泡排序的算法實現。本題使用冒泡排序從前往后相鄰數據進行兩兩比較,進行降序排序,求排序完成時數據交換的總次數。第1遍排序共交換數據5次,第2遍排序共交換數據2次,第3遍排序共交換數據1次,第4遍排序共交換數據1次,第5遍排序共交換數據1次,第6遍排序共交換數據1次,因此,共交換數據次數為5+2+1+1+1+1=11,答案為C。答案 C【方法總結】 在掌握冒泡排序常規算法的基礎上,還要對冒泡排序的各種變式進行研究,做到舉一反三,觸類旁通。1.現有包含10個元素的數組d,使用冒泡排序法對此數組元素進行升序排序,部分VB代碼如下:For i=1 To 9 For j=__________①________ If __________②________Thenk=d(j):d(j)=d(j+1):d(j+1)=k End If Next jNext i劃線①②處應填寫的正確語句是( )A.①i+1 To n,②d(j)>d(j+1)B.①i+1 To n,②d(j)C.①1 To n-i,②d(j)D.①1 To n-i,②d(j)>d(j+1)解析 本題考查冒泡排序算法。交換的數據對為“d(j)與d(j+1)”,因此可判斷相鄰元素是從前往后兩兩比較的,答案為D。答案 D2.有如下VB程序段:For i =1 To 3For j= 5 To i Step -1If a(j) < a(j+1) Then k = a(j):a(j)= a(j+1):a(j+1)= kEnd IfNext jList1.AddItem Str(a(i))Next j數組元素a(1)到a(6)的數據依次為“1,5,7,6,9,3”,經過該程序段加工后,列表框List1中顯示( )A.9、7、6 B.1、3、5C.9、7、6、1、5、3 D.9、7、6、5、3、1解析 比較對象為a(j)和a(j+1),但j的初值為5,終值為i。每趟比較還是從最后一個位置的元素開始,與他前面的元素比較,當a(j)比他后面元素的小,發生交換,即為降序排列。i從1循環到3,即進行了3趟排序,且只輸出前面的3個數。答案 A3.n個數據的冒泡排序需要經過n-1遍加工,每一遍加工自下而上比較相鄰兩個數據,把較大者交換到上面。小劉發現:當某一遍加工過程中沒有數據交換,說明數據已經有序,無需進一步加工。為此,小劉對算法進行優化,編寫了一個VB程序,功能如下:運行程序時,在列表框List1中顯示排序前數據,單擊“排序”按鈕Command1,在列表框List2 中顯示這些數據按升序排序后的結果,在標簽Label3中顯示排序過程的加工遍數,在標簽Label4中顯示排序過程的數據交換次數。運行效果如下圖所示。實現上述功能的VB代碼如下,但加框處代碼有錯,請改正。Dim a(1 To 8)As IntegerDim n As IntegerPrivate Sub Form_Load() ′n=8,排序前數據存儲在數組a中,并在列表框List1中顯示 ′代碼略End SubPrivate Sub Command1_Click() Dim i As Integer, j As Integer, t As Integer, c As Integer Dim flag As Boolean For i = 1 To nList1.AddItem Str(a(i)) Next i i = 1 flag = False Do While ′(1)flag = TrueFor j = n To i + 1 Step -1 If a(j) > a(j - 1) Thent = a(j): a(j) = a(j - 1): a(j - 1) = t c = c + 1 flag = False End IfNext ji = i + 1 Loop Label3.Caption = “排序過程的加工遍數為” + ′(2) Label4.Caption = “排序過程共數據交換次數為” + Str(c) For i = 1 To nList2.AddItem Str(a(i)) Next iEnd Sub程序中加框(1)處應改正為___________________________________________;加框(2)處應改正為__________________________________________________。解析 本題主要考查的是冒泡排序的程序實現。n個數進行排序,共需進行n-1遍(趟)。若進行i遍后數據已經有序,則不需要再進行排序。排序結束的條件的是:排序遍數小于n-1遍,且數據有序。Flag=True表示數據相鄰數據無交換,說明數據已經有序,因此(1)處的語句應更正為:i<=n-1 And flag=False或i<=n-1 And Not flag;變量i存儲排序遍數,由于i的初值為1,因此總的排序遍數為i-1,因此(2)處語句更正為Str(i-1)。答案 (1)i<=n-1 And flag=False或i<=n-1 And Not flag (2)Str(i-1)基礎鞏固1.有如下程序段:tot = 0For i =1 To 4yes=FalseFor j=5 To i+1 Step -1If a(j)>a(i) Then yes=True:tot=tot+1 t=a(j):a(j)=a(i):a(i)=tEnd IfNext jIf yes=False Then Exit ForNext i數組元素a(1)到a(5)的值依次為“29,23,9,14,97”,經該程序段“加工”后,tot的值為( )A.2 B.3 C.4 D.5解析 比較和交換的對象為a(j)和a(i),并不屬于典型的冒泡算法,是冒泡的一種變式。當yes=True時,說明已經發生交換,并統計交換次數tot。分i=1,2,3,4分別進行討論。當i=1時,交換的結果為97,23,9,14,29,只交換一次。當i=2時,交換的結果為97,29,9,14,23,也交換了一次;當i=3時,交換的結果為97,29,23,14,9,也交換了一次;當i=4時,沒有交換。答案 B2.有8個數據100、46、39、85、11、10、66、90依次存放在數組元素a(1)到a(8)中,部分VB程序段如下所示:n = Val(Text1.Text)x = 0For i = 1 To n - 1 For j = 8 To i + 1 Step -1If a(j) > a(j - 1) Then tp = a(j): a(j) = a(j - 1): a(j - 1) = tp x = x + 1End If Next jNext iText2.Text = Str(x)程序執行時,在文本框Text1中輸入“3”,則文本框Text2輸出的值是( )A.6 B.10 C.11 D.12解析 本題主要考查的是冒泡排序算法。本程序的功能是求兩遍排序完成時,共進行的數據交換的次數。第一遍排序完成時,需交換6次,第二遍排序完成時,需交換4次,兩遍排序完成時,共進行的數據交換的次數為6+4=10,因此答案為B。答案 B3.如下VB程序段:Private Sub Command1_Click() Dim i As Integer, j As Integer, temp As Integer, st As String Dim d(1 To 10) As Integer For i = 1 To 10d(i) = Int(Rnd * 100 + 1) Next i st = “ ” For i = 1 To 3For j = 1 To 10 - i If d(j) > d(j + 1) Thentemp = d(j): d(j) = d(j + 1): d(j + 1) = temp End IfNext jst = Str(d(j)) + st Next i Text1.Text = stEnd Sub程序運行時,生成的10個隨機整數依次為“1,18,3,66,56,77,85,6,7,12”,則在文本框Text1中顯示的內容是( )A.1 3 6 B.6 3 1C.85 77 66 D.66 77 85解析 本題考查的是冒泡排序的算法實現。該程序的功能是對數據使用冒泡排序升序排序3趟,并將每趟得到的最大值存放在字符串st中,需注意的是語句st = Str(d(j)) + st,即將當前得到的最大數拼接在字符串st的前面。因此,三趟排序結束后,變量st的值為“ 66 77 85”,答案為D。答案 D能力提升4.小吳為了研究冒泡排序過程中數據的“移動”情況,編寫了一個VB程序,功能如下:在列表框List1中顯示排序前數據(存儲在數組a中),在文本框Text1中輸入初始位置(即下標值),單擊“排序”按鈕Command1后,在標簽Label1中顯示指定初始位置的數據在排序過程中的位置變化情況,排序后的數據顯示在列表框List2中。程序運行界面如圖所示。實現上述功能的VB程序如下,但加框處代碼有錯,請改正。Dim a(1 To 8) As IntegerDim n As IntegerPrivate Sub Form_Load() a(1) = 30: a(2) = 47: a(3) = 30: a(4) = 72 a(5) = 70: a(6) = 23: a(7) = 99: a(8) = 24 n = 8 For i = 1 To 8List1.AddItem a(i) Next iEnd SubPrivate Sub Command1_Click() Dim i As Integer, j As Integer, k As Integer Dim pos As Integer Dim s As String s = Text1.Text pos = Val(Text1.Text) For i = 1 To n - 1For j = n To i + 1 Step -1 If a(j) < a(j - 1) Then ′①a(j - 1) = a(j)a(j) = k′如果pos位置的數據參與交換,則更新pos值,記錄pos變化位置If pos = j Then pos = j - 1 s = s + “→” + Str(pos) ′② pos = j s = s + “→” + Str(pos)End If End IfNext j Next iLabel1.Caption = “位置變化情況:” + s For i = 1 To nList2.AddItem Str(a(i)) Next iEnd Sub程序中加框①處應改正為______________________________________;加框②處應改正為____________________________________________。解析 程序①處代碼表示交換變量a(j)和a(j - 1)的值;交換變量a(j)和a(j - 1)的值后,該兩個元素數據位置發生變化,接下來判斷這兩個元素的下標是否和pos相同,如果pos和j相同,已經被交換到j-1位置,pos需要更新,否則如果pos和j-1相同,已經被交換到j位置,pos需要更新。答案 ①k=a(j-1) ②ElseIf pos = j - 1 Then5.下列VB程序的功能是:程序運行時,單擊“生成數據”按鈕Command1后,產生20個[1,200]范圍內互不相同的隨機整數,并依次顯示在列表框List1中;單擊“開始處理”按鈕Command2,首先將數據從小到大排序,并將排序結果顯示在列表框List2中,然后在排序的數據中尋找最長的連續整數段(由連續的整數組成的數據段),若最長連續整數段有多段,則輸出最先找到的數據段,并將結果顯示在文本框Text1中。程序運行效果如圖所示。(1)下列有關事件處理過程“Command1_Click()”Do循環中語句“x = Int(Rnd * 200) + 1”執行次數的說法正確的是________(單選,填字母:A.執行19次 / B.執行20次 / C.大于或等于19次)。(2)請在程序劃線處填入合適的代碼。Dim num(0 To 20) As Integer ′存儲產生的互不相同的隨機整數Dim n As Integer ′n用于統計已經產生的隨機整數個數Function fx(x As Integer) As Boolean Dim i As Integer,flag As Boolean flag=False i = n Do While ____①____If x < > num(i) Then i = i - 1 Else Exit Do Loop If i > 0 Then flag = True②____End FunctionPrivate Sub Command1_Click() Dim i As Integer, j As Integer Dim x As Integer, k As Integer Randomize ′初始化Rnd函數 n = 1 x = Int(Rnd * 200+1) num(1) = x List1.AddItem Str(num(1)) Do While n <20 x = Int(Rnd * 200+1) If fx(x)=False Thenn = n + 1num(n) = xList1.AddItem Str(num(n)) End If LoopEnd SubPrivate Sub Command2_Click() Dim i As Integer, j As Integer, tt As Integer, max As Integer, maxi As Integer Dim ans As String For i = 1 To n - 1 For j = n To i + 1 Step -1 If num(j) < num(j - 1) Then tt = num(j): num(j) = num(j - 1): num(j - 1) = tt End If Next j Next i For i = 1 To 20 List2.AddItem Str(num(i)) Next i max = 1 k = 1 For i = 2 To nIf ____③____Then k = k + 1Else If k > max Then max = k: maxi = i - 1 k = 1End If Next i For i =____④____To maxians = ans + Str(num(i)) Next i Text1.Text = ansEnd Sub解析 判斷產生的隨機整數x是否已經存在(判重)的方法為:將x分別與已產生的前n-1個數進行比較,若有重復則返回函數值True,否則返回False,因此①處代碼為i>=1或i>0,函數值通過函數名返回,因此②處語句為fx=flag;③處語句表示判斷第i個與第i-1個數是不是連續整數,若是則連續整數個數加1,因此③處語句為num(i) = num(i - 1) + 1;程序④處表示最長連續整數段的范圍,結束位置為maxi,長度為k,因此開始位置為maxi - max + 1。答案 (1)C (2)①i>=1或i>0 ②fx=flag ③num(i) = num(i - 1) + 1 ④maxi - max + 1課件17張PPT。第2節 冒泡排序及程序實現一、冒泡排序算法思想什么是冒泡排序將n個數據看作豎向排列的一組數據,每趟排序自下而上對每對相鄰數據進行比較,若次序不符合要求就進行交換。每趟排序結束時都能使排序范圍內關鍵字最小的記錄像一個氣泡一樣升到上端的對應位置,整個排序過程共進行n-1趟,依次將關鍵字最小、次小……的各個數據冒到表的第一個、第二個……位置上。二、冒泡排序算法框架約定:對數組d中的n個數據進行升序排序。(1)從后往前進行比較For i = 1 To n - 1 ′n個數據進行排序,共需進行n-1趟 For j = n To i + 1 Step - 1 ′第i趟排序時If d(j) < d(j-1) Then ′符合條件則進行數據交換 交換數據元素d(j)與d(j-1)的值End If Next jNext i注:若要按降序排列,將程序中的語句“If d(j)d(j -1) Then”即可。(2)從前往后進行比較For i = 1 To n - 1 ′n個數據進行排序,共需進行n-1趟For j = 1 To n - i ′第i趟排序時If d(j) > d(j+1) Then ′符合條件則進行數據交換 交換數據元素d(j)與d(j+1)的值 End IfNext jNext i注:若要按降序排列,將程序中的語句“If d(j)>d(j+1) Then”改為“If d(j)(1)從后往前進行比較時程序如下:For i = 1 To n - 1 ′n個數排序共需進行n-1趟 For j = n To i + 1 Step -1 ′第i趟排序時 If d(j) < d(j - 1) Then ′若后面元素小于前面元素時進行交換 temp = d(j) d(j) = d(j - 1) d(j - 1) = temp End If Next jNext i(2)從前往后進行比較時程序如下:For i = 1 To n - 1 ′n個數排序共需進行n-1趟 For j = 1 To n - i ′第i趟排序時If d(j) > d(j + 1) Then ′若前面元素大于面元素時進行交換 temp = d(j) d(j) = d(j + 1) d(j + 1) = tempEnd If Next jNext i一、冒泡排序算法思想理解冒泡排序的基本思想,學會將待排數據按照冒泡算法思想進行手工模擬排序。【典例1】 使用冒泡排序對下表中9個數據進行排序,排序過程如下所示:則第三遍的排序結果為( )A.25,35,50,60,100,80,70,85,90B.25,35,50,100,60,80,70,85,90C.25,35,50,100,80,70,60,85,90D.25,35,50,60,70,80,85,90,100解析 本題主要考查冒泡排序算法的基本思想。觀察第1、2遍的排序結果可知,該冒泡排序采用從后往前兩兩比較的方式進行升序排序,因此手工模擬可知,第3遍排序后的結果為25,35,50,100,60,80,70,85,90,答案為B。答案 B【變式訓練】 采用冒泡排序算法對數組a中的6個數據“5,4,51,16,9,30”進行排序,部分程序如下:For i=1 To 3 For j=6 To i+1 Step -1 If a(j)>a(j-1) Then End If Next jNext i下列說法正確的是( )A.升序排序,實線框中的語句共執行了8次B.升序排序,實線框中的語句共執行了10次C.降序排序,實線框中的語句共執行了8次D.降序排序,實線框中的語句共執行了10次解析 本題主要考查的是冒泡排序。根據語句“If a(j)>a(j-1)Then”可知,排序方式為從大小到排序(降序),排序過程如下:數據交換次數為4+2+2=8次,因此答案為C。答案 C【方法總結】 冒泡排序是通過相鄰數據兩兩比較,可以從前往后進行比較,也可以從后往前進行比較,通過If語句中表達式確定排序的升降性。二、冒泡排序算法實例應用【典例2】 某VB程序段如下:s = “ ”For i = 1 To 3 For j = 7 To i + 1 Step -1 If a(j) < a(j - 1) Then k = a(j): a(j) = a(j - 1): a(j - 1) = k End If Next j s = s + Str(a(i))Next iText1.Text = s數組元素a(1)到a(7)的初始數據依次為“3,9,1,5,8,6,2”,經過該程序段“加工”后,文本框Text1中顯示的內容是( )A.1 2 3 B.9 8 6C.3 9 1 D.8 6 2解析 本題考查的是冒泡排序的算法實現。此題程序的功能是求3遍冒泡排序(升序)后數據序列中前三個數的情況,因此前三個數為1,2,3。答案 A【變式訓練】 使用冒泡排序對數組a中的數據進行排序,程序段如下:s = “ ”For i = 1 To 7 For j = 1 To 8 - i If a(j) < a(j + 1) Then k = a(j): a(j) = a(j + 1): a(j + 1) = k End If Next jNext i數組元素a(1)到a(8)的初始數據依次為“11,8,21,15,18,16,2,30”,排序完成時,共進行數據交換的次數為( )A.9 B.10 C.11 D.12解析 本題考查的是冒泡排序的算法實現。本題使用冒泡排序從前往后相鄰數據進行兩兩比較,進行降序排序,求排序完成時數據交換的總次數。第1遍排序共交換數據5次,第2遍排序共交換數據2次,第3遍排序共交換數據1次,第4遍排序共交換數據1次,第5遍排序共交換數據1次,第6遍排序共交換數據1次,因此,共交換數據次數為5+2+1+1+1+1=11,答案為C。答案 C【方法總結】 在掌握冒泡排序常規算法的基礎上,還要對冒泡排序的各種變式進行研究,做到舉一反三,觸類旁通。 展開更多...... 收起↑ 資源列表 第2節 冒泡排序及程序實現.doc 第五單元第2節 冒泡排序及程序實現.pptx 縮略圖、資源來源于二一教育資源庫