




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、排序问题排序问题 1 1、冒泡法、冒泡法( (起泡法起泡法) ) 2 2、顺序交换法、顺序交换法 3 3、选择法、选择法 4 4、插入法、插入法1、冒泡法、冒泡法首先我们来看首先我们来看把最大的那个数放在最后位置上把最大的那个数放在最后位置上的方法:的方法:假设有假设有5 5个数,分别为个数,分别为1010,2 2,6 6,7 7,4 4,存放在,存放在a(1)-a(5)a(1)-a(5)中。中。 首先,从首先,从a(1)a(1)到到a(5)a(5),相邻的两数相邻的两数两两进行比较,在每次比两两进行比较,在每次比较过程中,若前一个数比后一个数大,则交换两元素的内容。较过程中,若前一个数比后一
2、个数大,则交换两元素的内容。第一轮的比较过程:第一轮的比较过程:for j=1 to 4 for j=1 to 4 if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=a(j+1) : a(j+1)=t)=a(j+1) : a(j+1)=t End if End ifNext jNext j1、冒泡法、冒泡法n现在重复上述算法:把现在重复上述算法:把a(1)a(1)到到a(4)a(4)中的最大数放在中的最大数放在a(4)a(4)中,中,a(1)a(1)到到a(3) a(3) 中的最大数放在中的最大数放在a(3)a(3)
3、中,中,a(1)a(1)与与a(2) a(2) 中的最大数放在中的最大数放在a(2)a(2)中。这样一共经过中。这样一共经过4 4次次选大就把选大就把a(1)a(1)到到a(5)a(5)中的数进行由小到大排序。中的数进行由小到大排序。 在排序过程中小数象气泡一样上浮,而大数逐个在排序过程中小数象气泡一样上浮,而大数逐个下沉,所以叫起泡法。下沉,所以叫起泡法。第第1 1轮:轮:for j=1 to for j=1 to 4 4 if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=a(j+1) : a(j+1)=t)=a(
4、j+1) : a(j+1)=t End if End ifNext jNext j第第2 2轮:轮:for j=1 tofor j=1 to 3 3 if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=a(j+1) : a(j+1)=t)=a(j+1) : a(j+1)=t End if End ifNext jNext j第第3 3轮:轮:for j=1 to for j=1 to 2 2 if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=
5、a(j+1) : a(j+1)=t)=a(j+1) : a(j+1)=t End if End ifNext jNext j第第4 4轮:轮:for j=1 to for j=1 to 1 1 if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=a(j+1) : a(j+1)=t)=a(j+1) : a(j+1)=t End if End ifNext jNext j第第i i轮:轮:for j=1 to for j=1 to 5-i5-i if a(j if a(j)a(j+1) Then )a(j+1) Then
6、t=a(j t=a(j): a(j): a(j)=a(j+1): a(j+1)=t)=a(j+1): a(j+1)=t End if End ifNext jNext jFor i=1 to 4For i=1 to 4Next iNext i1.冒泡法冒泡法冒泡法程序清单:冒泡法程序清单:Dim a(1 To 5) As IntegerDim a(1 To 5) As IntegerFor i = 1 To 5For i = 1 To 5 a(i) = Val(InputBox a(i) = Val(InputBox(输入一个数输入一个数)Next iNext iFor i=1 to 4For
7、 i=1 to 4 For j=1 To 5-i For j=1 To 5-i if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a(j)=a(j+1): a(j+1)=t)=a(j+1): a(j+1)=t End if End if Next j Next jNext i Next i For i = 1 To 5For i = 1 To 5 Print a(i Print a(i););Next iNext i冒泡排序冒泡排序思考:如果这思考:如果这5 5个数是个数是2 2,4 4,6 6,7 7,1010,简述程序执行
8、流程。,简述程序执行流程。1.冒泡法冒泡法改进算法改进算法: :Dim a(1 To 5) As IntegerDim a(1 To 5) As IntegerFor i = 1 To 5For i = 1 To 5 a(i) = Val(InputBox a(i) = Val(InputBox(输入一个数输入一个数)Next iNext iFor i=1 to 4For i=1 to 4 flag=0flag=0 For j=1 To 5-i For j=1 To 5-i if a(j if a(j)a(j+1) Then )a(j+1) Then t=a(j): a(j t=a(j): a
9、(j)=a(j+1): a(j+1)=t: )=a(j+1): a(j+1)=t: flag=1flag=1 End ifEnd if Next j Next j If flag=0 Then Exit ForIf flag=0 Then Exit ForNext i Next i For i = 1 To 5For i = 1 To 5 Print a(i Print a(i););Next iNext i1.冒泡法冒泡法对已知存放在数组中的对已知存放在数组中的n n个数,用冒泡法按个数,用冒泡法按递增顺序递增顺序排序。排序。 (1) (1) 从第一个元素开始,将从第一个元素开始,将相邻的数
10、比较相邻的数比较,若为,若为逆序,就逆序,就交换交换,比较完一轮,最大的数已沉底,成为数组中的最后一个,比较完一轮,最大的数已沉底,成为数组中的最后一个元素元素a(na(n) ) (2) (2) 对对a(1)a(1)和和a(n-1)a(n-1)的的n-1n-1个数进行同个数进行同(1)(1)的操作,次大的操作,次大的数放入的数放入a(n-1)a(n-1)中,完成第二轮排序。中,完成第二轮排序。 (3) (3) 进行进行n-1n-1轮排序,所有的数排序完毕。轮排序,所有的数排序完毕。1.冒泡法冒泡法n n个数冒泡法递增排序程序清单:个数冒泡法递增排序程序清单: Dim a%(), i%, j%,
11、 n%Dim a%(), i%, j%, n% n = InputBox n = InputBox(请输入一个正整数请输入一个正整数) ReDim ReDim a(1 To n) a(1 To n) For i = 1 To n For i = 1 To n a(i) = Int(Rnd a(i) = Int(Rnd * * 100) : Print a(i 100) : Print a(i);); Next i Next i For i = 1 To For i = 1 To n - 1n - 1 For j = 1 To For j = 1 To n - in - i If If a(ja
12、(j) ) a(ja(j + 1) + 1) Then Then t = a(j): a(j) = a(j + 1): a(j t = a(j): a(j) = a(j + 1): a(j + 1) = t + 1) = t End If End If Next j Next j Next i Next i Print Print For i = 1 To n For i = 1 To n Print a(i Print a(i);); Next i Next i2、顺序交换法、顺序交换法我们再来看一种我们再来看一种将最小的数放在第一个位置将最小的数放在第一个位置的算法的算法先设定用先设定用a
13、(1)a(1)存放最小值,然后用存放最小值,然后用a(1)a(1)分别与其后分别与其后的每一个数的每一个数a(j)(ja(j)(j=2.5)=2.5)进行比较,在比较过程中进行比较,在比较过程中如果如果a(1)a(1)不是小的数,就将不是小的数,就将a(1)a(1)与与a(ja(j) )互换。互换。第一轮的比较过程第一轮的比较过程For j=2 To 5For j=2 To 5 if(a(1)a(j if(a(1)a(j) Then) Then t=a(1) : a(1)=a(j) : a(j t=a(1) : a(1)=a(j) : a(j)=t)=t End if End ifNext j
14、Next j2、顺序交换法、顺序交换法n现在重复上述算法:把现在重复上述算法:把a(2)a(2)到到a(5)a(5)中的最小数放在中的最小数放在a(2)a(2)中,中,a(3)a(3)到到a(5)a(5)中的最小数放在中的最小数放在a(3)a(3)中,中,a(4)a(4)与与a(5)a(5)中的最小数放在中的最小数放在a(4)a(4)中。这样一共经过中。这样一共经过4 4次选次选小就把小就把a(1)a(1)到到a(5)a(5)中的数进行由小到大排序。中的数进行由小到大排序。第第1 1轮:轮:for j=for j=2 2 to 5 to 5 if if a(1)a(1)a(ja(j) Then
15、 ) Then t=a(1): a(1)=a(j) : a(j t=a(1): a(1)=a(j) : a(j)=t)=t End if End ifNext jNext j第第2 2轮:轮:for j=for j=3 3 to 5 to 5 if if a(2)a(2)a(ja(j) Then ) Then t=a(2): a(2)=a(j) : a(j t=a(2): a(2)=a(j) : a(j)=t)=t End if End ifNext jNext j第第3 3轮:轮:for j=for j=4 4 to 5 to 5 if if a(3)a(3)a(ja(j) Then ) T
16、hen t=a(3): a(3)=a(j) : a(j t=a(3): a(3)=a(j) : a(j)=t)=t End if End ifNext jNext j第第4 4轮:轮:for j=for j=5 5 to 5 to 5 if if a(4)a(4)a(ja(j) Then ) Then t=a(4): a(4)=a(j) : a(j t=a(4): a(4)=a(j) : a(j)=t)=t End if End ifNext jNext j第第i i轮:轮:for j=for j=i+1i+1 to 5 to 5 if if a(ia(i) ) a(ja(j) ) Then
17、Then t=a(i t=a(i): a(i): a(i)=a(j)=a(j): a(j): a(j)=t)=t End if End ifNext jNext jFor i=1 to 4For i=1 to 4Next iNext i2、顺序交换法、顺序交换法 Dim a(1 To 5) As Integer Dim a(1 To 5) As Integer For i = 1 To 5 For i = 1 To 5 a(i) = Val(InputBox a(i) = Val(InputBox(输入一个数输入一个数) Next i Next i For i = 1 To 4 For i =
18、 1 To 4 For j = i+1 To 5 For j = i+1 To 5 If If a(ia(i) ) a(j a(j) Then ) Then t = a(i): a(i) = a(j): a(j t = a(i): a(i) = a(j): a(j) = t ) = t End if End if Next j Next j Next i Next i For i = 1 To 5 For i = 1 To 5 Print a(i Print a(i);); Next i Next i顺序排序顺序排序2、顺序交换法、顺序交换法对已知存放在数组中的对已知存放在数组中的n n个数,
19、用顺序交换法按个数,用顺序交换法按递增顺序递增顺序排排序。序。 (1) (1) 从第一个元素开始,将它和其后的每个元素进行比较,从第一个元素开始,将它和其后的每个元素进行比较,若为逆序,就交换,比较完一轮,若为逆序,就交换,比较完一轮,a(1)a(1)成为数组中的最小的元成为数组中的最小的元素。素。 (2) (2) 对对a(2)a(2)和和a(na(n) )的的n-1n-1个数进行同个数进行同(1)(1)的操作,次小的数的操作,次小的数放入放入a(2)a(2)中,完成第二轮排序。中,完成第二轮排序。 (3) (3) 进行进行n-1n-1轮排序,所有的数排序完毕。轮排序,所有的数排序完毕。2、顺
20、序交换法、顺序交换法n n个数顺序法递增排序程序清单:个数顺序法递增排序程序清单:Dim a%(), i%, j%, n%Dim a%(), i%, j%, n% n = InputBox n = InputBox(请输入一个正整数请输入一个正整数) ReDim ReDim a(1 To n) a(1 To n) For i = 1 To n For i = 1 To n a(i) = Int(Rnd a(i) = Int(Rnd * * 100): Print a(i 100): Print a(i);); Next i Next i For i = 1 To n - 1 For i = 1
21、 To n - 1 For j = i + 1 To n For j = i + 1 To n If a( If a(i i) a() a(j j) Then) Then t = a(i): a(i) = a(j): a(j t = a(i): a(i) = a(j): a(j) = t) = t End If End If Next j Next j Next i Next i Print Print For i = 1 To n For i = 1 To n Print a(i Print a(i);); Next i Next i3、选择法、选择法算法:不急于交换,先找出算法:不急于交换
22、,先找出a(1)a(1)到到a(5)a(5)中最小数所在中最小数所在的位置的位置K K,一遍扫描完之后,再把,一遍扫描完之后,再把a(1)a(1)与与a(Ka(K) )互换。互换。重复此算法,只是每次重复进行比较的数列范围向后重复此算法,只是每次重复进行比较的数列范围向后移一个位置。即第二遍从移一个位置。即第二遍从a(2)a(2)到到a(5)a(5)中去找最小数的中去找最小数的位置,最后把位置,最后把a(2)a(2)与与a(Ka(K) )对调,第三遍从对调,第三遍从a(3)a(3)到到a(5)a(5)中去找最小数的位置,最后把中去找最小数的位置,最后把a(3)a(3)与与a(Ka(K) )对调
23、,对调,此此过程重复过程重复4 4次后,即将次后,即将a a数组中的数组中的5 5个数按由小到大的个数按由小到大的顺序排好。这种排序方法叫选择法。顺序排好。这种排序方法叫选择法。第第1 1轮:轮:k=k=1 1for j=for j=2 2 to 5 to 5 if if a(ja(j) ) a(ka(k) ) Then k=j Then k=jNext jNext jif k1 then t=a(1):a(1)=a(k):a(kif k1 then t=a(1):a(1)=a(k):a(k)=t)=t第第2 2轮:轮:k=k=2 2for j=for j=3 3 to 5 to 5 if i
24、f a(ja(j) )a(ka(k) Then k=j) Then k=jNext jNext jif k2 then t=a(2):a(2)=a(k):a(kif k2 then t=a(2):a(2)=a(k):a(k)=t)=t第第3 3轮:轮:k=k=3 3for j=for j=4 4 to 5 to 5 if if a(ja(j) )a(ka(k) Then k=j) Then k=jNext jNext jif k3 then t=a(3):a(3)=a(k):a(kif k3 then t=a(3):a(3)=a(k):a(k)=t)=t第第4 4轮:轮:k=k=4 4for
25、j=for j=5 5 to 5 to 5 if if a(ja(j) )a(ka(k) Then k=j) Then k=jNext jNext jif k4 then t=a(4):a(4)=a(k):a(kif k4 then t=a(4):a(4)=a(k):a(k)=t)=t第第i i轮:轮:k=k=i ifor j=for j=i+1i+1 to 5 to 5 if if a(ja(j) ) a(ka(k) ) Then k=j Then k=jNext jNext jif kif ki i then t=a(i):a(i then t=a(i):a(i)=a(k):a(k)=a(
26、k):a(k)=t)=tFor i=1 to 4For i=1 to 4Next iNext i3、选择法、选择法选择排序法程序清单:选择排序法程序清单:Dim a(1 To 5) As IntegerDim a(1 To 5) As IntegerFor i = 1 To 5For i = 1 To 5 a(i) = Val(InputBox a(i) = Val(InputBox(输入一个数输入一个数)Next iNext iFor i=1 to 4For i=1 to 4 k=i k=i For j=i+1 To 5 For j=i+1 To 5 if a(j)a(k if a(j)a(
27、k) Then k=j) Then k=j Next j Next j if ki Then t=a(i): a(i)=a(k): a(k if ki Then t=a(i): a(i)=a(k): a(k)=t)=tNext i Next i For i = 1 To 5For i = 1 To 5 Print a(i Print a(i););Next iNext i排序过程排序过程3、选择法、选择法对已知存放在数组中的对已知存放在数组中的n n个数,用选择法按个数,用选择法按递增顺序递增顺序排排序。序。 (1) (1) 从从n n个数的序列中选出最小的数,与第个数的序列中选出最小的数,与
28、第1 1个数交个数交换位置;换位置; (2) (2) 除第除第1 1个数外,其余个数外,其余n-1n-1个数再按个数再按(1)(1)的方法选的方法选出次小的数,与第出次小的数,与第2 2个数交换位置;个数交换位置; (3) (3) 重复重复(1)n-1(1)n-1遍,最后构成递增序列。遍,最后构成递增序列。3、选择法、选择法n n个数选择法递增排序程序清单:个数选择法递增排序程序清单:Dim a%(), i%, j%, n%Dim a%(), i%, j%, n% n = InputBox n = InputBox(请输入一个正整数请输入一个正整数) ReDim ReDim a(1 To n)
29、 a(1 To n) For i = 1 To n For i = 1 To n a(i) = Int(Rnd a(i) = Int(Rnd * * 100): Print a(i 100): Print a(i);); Next i Next i For i = 1 To n 1 For i = 1 To n 1 k=i k=i For j = i + 1 To n For j = i + 1 To n If a( If a(j j) a() a(k k) Then k=j) Then k=j Next j Next j if ki then t=a(i): a(i)=a(k): a(k if ki then t=a(i): a(i)=a(k): a(k)=t)=t Next i Next i Print Print For i = 1 To n For i = 1 To n Print a(i Print a(i);); Next i Next i4 插入法插入法147 10 13 16 19 22 25a数组数组key=20例例7 将一个数插入到有序的(由小到大)数列中,插将一个数插入到有序的(由小到大)数列中,插入后数列仍然有序。入后数列仍然有序。20 20 20 20 2020 20 20147 10 13 16 19 222
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论