排序问题1、冒泡法(起泡法)2、顺序交换法3、选择法4、插入法1、冒泡法首先我们来看把最大的那个数放在最后位置上的方法:假设有5个数,分别为10,2,6,7,4,存放在a(1)-a(5)中。首先,从a(1)到a(5),相邻的两数两两进行比较,在每次比较过程中,若前一个数比后一个数大,则交换两元素的内容。第一轮的比较过程:forj=1to4ifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextj1、冒泡法现在重复上述算法:把a(1)到a(4)中的最大数放在a(4)中,a(1)到a(3)中的最大数放在a(3)中,a(1)与a(2)中的最大数放在a(2)中。这样一共经过4次选大就把a(1)到a(5)中的数进行由小到大排序。在排序过程中小数象气泡一样上浮,而大数逐个下沉,所以叫起泡法。第1轮:forj=1to4ifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextj第2轮:forj=1to3ifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextj第3轮:forj=1to2ifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextj第4轮:forj=1to1ifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextj第i轮:forj=1to5-iifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextjFori=1to4Nexti1.冒泡法冒泡法程序清单:Dima(1To5)AsIntegerFori=1To5a(i)=Val(InputBox(输入一个数))NextiFori=1to4Forj=1To5-iifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndifNextjNextiFori=1To5Printa(i);Nexti冒泡排序思考:如果这5个数是2,4,6,7,10,简述程序执行流程。1.冒泡法改进算法:Dima(1To5)AsIntegerFori=1To5a(i)=Val(InputBox(输入一个数))NextiFori=1to4flag=0Forj=1To5-iifa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=t:flag=1EndifNextjIfflag=0ThenExitForNextiFori=1To5Printa(i);Nexti1.冒泡法对已知存放在数组中的n个数,用冒泡法按递增顺序排序。(1)从第一个元素开始,将相邻的数比较,若为逆序,就交换,比较完一轮,最大的数已沉底,成为数组中的最后一个元素a(n)(2)对a(1)和a(n-1)的n-1个数进行同(1)的操作,次大的数放入a(n-1)中,完成第二轮排序。(3)进行n-1轮排序,所有的数排序完毕。1.冒泡法n个数冒泡法递增排序程序清单:Dima%(),i%,j%,n%n=InputBox(请输入一个正整数)ReDima(1Ton)Fori=1Tona(i)=Int(Rnd*100):Printa(i);NextiFori=1Ton-1Forj=1Ton-iIfa(j)a(j+1)Thent=a(j):a(j)=a(j+1):a(j+1)=tEndIfNextjNextiPrintFori=1TonPrinta(i);Nexti2、顺序交换法我们再来看一种将最小的数放在第一个位置的算法先设定用a(1)存放最小值,然后用a(1)分别与其后的每一个数a(j)(j=2..5)进行比较,在比较过程中如果a(1)不是小的数,就将a(1)与a(j)互换。第一轮的比较过程Forj=2To5if(a(1)a(j))Thent=a(1):a(1)=a(j):a(j)=tEndifNextj2、顺序交换法现在重复上述算法:把a(2)到a(5)中的最小数放在a(2)中,a(3)到a(5)中的最小数放在a(3)中,a(4)与a(5)中的最小数放在a(4)中。这样一共经过4次选小就把a(1)到a(5)中的数进行由小到大排序。第1轮:forj=2to5ifa(1)a(j)Thent=a(1):a(1)=a(j):a(j)=tEndifNextj第2轮:forj=3to5ifa(2)a(j)Thent=a(2):a(2)=a(j):a(j)=tEndifNextj第3轮:forj=4to5ifa(3)a(j)Thent=a(3):a(3)=a(j):a(j)=tEndifNextj第4轮:forj=5to5ifa(4)a(j)Thent=a(4):a(4)=a(j):a(j)=tEndifNextj第i轮:forj=i+1to5ifa(i)a(j)Thent=a(i):a(i)=a(j):a(j)=tEndifNextjFori=1to4Nexti2、顺序交换法Dima(1To5)AsIntegerFori=1To5a(i)=Val(InputBox(输入一个数))NextiFori=1To4Forj=i+1To5Ifa(i)a(j)Thent=a(i):a(i)=a(j):a(j)=tEndifNextjNextiFori=1To5Printa(i);Nexti顺序排序2、顺序交换法对已知存放在数组中的n个数,用顺序交换法按递增顺序排序。(1)从第一个元素开始,将它和其后的每个元素进行比较,若为逆序,就交换,比较完一轮,a(1)成为数组中的最小的元素。(2)对a(2)和a(n)的n-1个数进行同(1)的操作,次小的数放入a(2)中,完成第二轮排序。(3)进行n-1轮排序,所有的数排序完毕。2、顺序交换法n个数顺序法递增排序程序清单:Dima%(),i%,j%,n%n=InputBox(请输入一个正整数)ReDima(1Ton)Fori=1Tona(i)=Int(Rnd*100):Printa(i);NextiFori=1Ton-1Forj=i+1TonIfa(i)a(j)Thent=a(i):a(i)=a(j):a(j)=tEndIfNextjNextiPrintFori=1TonPrinta(i);Nexti3、选择法算法:不急于交换,先找出a(1)到a(5)中最小数所在的位置K,一遍扫描完之后,再把a(1)与a(K)互换。重复此算法,只是每次重复进行比较的数列范围向后移一个位置。即第二遍从a(2)到a(5)中去找最小数的位置,最后把a(2)与a(K)对调,第三遍从a(3)到a(5)中去找最小数的位置,最后把a(3)与a(K)对调,…此过程重复4次后,即将a数组中的5个数按由小到大的顺序排好。这种排序方法叫选择法。第1轮:k=1forj=2to5ifa(j)a(k)Thenk=jNextjifk1thent=a(1):a(1)=a(k):a(k)=t第2轮:k=2forj=3to5ifa(j)a(k)Thenk=jNextjifk2thent=a(2):a(2)=a(k):a(k)=t第3轮:k=3forj=4to5ifa(j)a(k)Thenk=jNextjifk3thent=a(3):a(3)=a(k):a(k)=t第4轮:k=4forj=5to5ifa(j)a(k)Thenk=jNextjifk4thent=a(4):a(4)=a(k):a(k)=t第i轮:k=iforj=i+1to5ifa(j)a(k)Thenk=jNextjifkithent=a(i):a(i)=a(k):a(k)=tFori=1to4Nexti3、选择法选择排序法程序清单:Dima(1To5)AsIntegerFori=1To5a(i)=Val(InputBox(输入一个数))NextiFori=1to4k=iForj=i+1To5ifa(j)a(k)Thenk=jNextjifkiThent=a(i):a(i)=a(k):a(k)=tNextiFori=1To5Printa(i);Nexti排序过程3、选择法对已知存放在数组中的n个数,用选择法按递增顺序排序。(1)从n个数的序列中选出最小的数,与第1个数交换位置;(2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3)重复(1)n-1遍,最后构成递增序列。3、选择法n个数选择法递增排序程序清单:Dima%(),i%,j%,n%n=InputBox(请输入一个正整数)ReDima(1Ton)Fori=1Tona(i)=Int(Rnd*100):Printa(i);NextiFori=1Ton–1k=iForj=i+1TonIfa(j)a(k)Thenk=jNextjifkithent=a(i):a(i)=a(k):a(k)=tNextiPrintFori=1TonPrinta(i);Nexti4插入法147101316192225a数组key=20例7将一个数插入到有序的(由小到大)数列中,插入后数列仍然有序。202020202020202014710131619222514710131619252220算法:1.找到插入数在数组中的位置i2.将从n到i的每个元素向后移动一个位置3.插入数4插入法将一个数插入到有序数列,使插入后数列仍然有序的程序清单:Dima(1To10)AsIntegerFori=1To9a(i)=(i-1)*3+1NextiKey=Val(InputBox(输入一个数))Fori=1to9Ifa(i)KeyThenExitFornextiFork=9ToiStep-1a(k+1)=a(k)Nextka(i)=KeyFori=1To10Printa(i);Nexti4插入法插入法2:用上面的插入方法将一批数排序(从小到大),设数列中开始只有一个元素。Dimx(1To10)AsIntegerFori=1To10x(i)=Val(InputBox(输入一个数))NextiFori=1To9Key=x(i+1)j=1DoWhile(Key=x(j)Andj=i)j=j+1LoopFork=iTojStep-1x(k+1)=x(k)Nextkx(j)=KeyNextiFori=1To10Printx(i);NextiForj=1toiIfx(j)KeyThenExitForNextj谢谢观赏