數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)(第2版)課件 6.3 交換類排序_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)(第2版)課件 6.3 交換類排序_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)(第2版)課件 6.3 交換類排序_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)(第2版)課件 6.3 交換類排序_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)(第2版)課件 6.3 交換類排序_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)結(jié)構(gòu)主講人:朱利華常州信息職業(yè)技術(shù)學(xué)院6.3交換類排序Part01冒泡排序又稱“起泡排序”較為經(jīng)典、比較簡(jiǎn)單的一種排序方法名字由來(lái):在排序過(guò)程中,類似水冒泡,?。ù螅┑脑亟?jīng)過(guò)不斷的交換由水底慢慢冒出什么是冒泡排序冒泡排序基本思路:對(duì)相鄰的元素進(jìn)行兩兩比較,逆序則交換順序,直到所有記錄都排好序?yàn)橹?。每一趟?huì)將最小或最大的元素“冒”到頂端,最終達(dá)到完全有序。基本思路冒泡排序數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)常州信息職業(yè)技術(shù)學(xué)院

待排序數(shù)組為R[1..N]:需要經(jīng)過(guò)n-1趟排序?qū)⒚總€(gè)元素看作有重量的氣泡,根據(jù)輕氣泡不能在重氣泡下面的原則,從下往上掃描數(shù)組R凡掃描到違反本原則的輕氣泡,就使其向上“漂浮”,如此反復(fù)進(jìn)行,直至最后任何兩個(gè)氣泡都是輕者在上,重者在下為止?;静僮髅芭菖判虮容^相鄰元素,如果第一個(gè)比第二個(gè)大,就交換位置;對(duì)每一對(duì)相鄰元素做同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè);重復(fù)步驟1~3,直到排序完成。算法描述冒泡排序示例【例6-4】假定有原始序列:83,16,9,96,27,75,42,69,34,存放在一個(gè)長(zhǎng)度為10的數(shù)組R中采用冒泡排序的方法對(duì)其進(jìn)行排序的過(guò)程如下:冒泡排序第7趟排序[9162734426975]8396第5趟排序[916273442]83697596第4趟排序[9162734]8342699675第3趟排序[91627]833442966975第2趟排序[916]83273496427569第1趟排序[9]8316279634754269初始關(guān)鍵字83169962775426934第6趟排序[91627344269]837596第8趟排序[91627344269758396]①冒泡排序冒泡排序-算法實(shí)現(xiàn)//使用冒泡排序方法實(shí)現(xiàn)整形數(shù)據(jù)元素排序publicstaticvoidbubbleSorted(inta[]){ for(inti=0;i<a.length-1;i++){//共比較n-1趟 for(intj=0;j<a.length-1-i;j++){//第i趟比較 if(a[j]>a[j+1]){//相鄰兩個(gè)元素進(jìn)行比較 inttemp=a[j];//逆序,兩兩交換位置 a[j]=a[j+1]; a[j+1]=temp; } } }}②改進(jìn)的冒泡排序冒泡排序-算法實(shí)現(xiàn)改進(jìn)冒泡算法思想:在冒泡處理過(guò)程中,沒(méi)有進(jìn)行任何交換,說(shuō)明序列已有序,則停止交換實(shí)現(xiàn)方法:設(shè)置一個(gè)哨兵flag,如果一次for循環(huán)沒(méi)有進(jìn)行交換,則元素已經(jīng)排好序,由哨兵控制退出循環(huán)//改進(jìn)的冒泡排序publicstaticvoidsort(int[]a){intmax=a.length-1;//max為數(shù)組長(zhǎng)度-1

for(inti=0;i<max;i++){booleanflag=true;//假設(shè)每一趟開(kāi)始都是有序for(intj=0;j<max-i;j++){if(a[j]>a[j+1]){//逆序,兩個(gè)數(shù)互換inttemp=a[j];

a[j]=a[j+1];a[j+1]=temp;flag=false;}}if(flag){break;}}}算法分析冒泡排序空間復(fù)雜度S(n)=O(1)穩(wěn)定性穩(wěn)定排序時(shí)間復(fù)雜度T(n)=O(n2)數(shù)據(jù)結(jié)構(gòu)(Java語(yǔ)言描述)常州信息職業(yè)技術(shù)學(xué)院Part02快速排序1962年由霍爾C.A.R.Hoare提出的一種劃分交換排序;采用分治策略,通常稱其為分治法;快速排序被認(rèn)為是一種最好的內(nèi)部排序方法。什么是快速排序快速排序是一個(gè)速度非??斓慕粨Q排序算法,基本思路:從待排序列中確定一個(gè)關(guān)鍵字(“基準(zhǔn)”),通過(guò)一趟排序?qū)⒃械男蛄蟹譃閮蓚€(gè)序列:一個(gè)序列中的所有元素均小于等于“基準(zhǔn)”另一個(gè)序列中的元素均大于等于“基準(zhǔn)”利用遞歸思想,將兩個(gè)序列再次分別確定“基準(zhǔn)”,接著進(jìn)行兩個(gè)子序列的快速排序?;舅悸房焖倥判蛳葟臄?shù)列中取出一個(gè)數(shù)作為“基準(zhǔn)”;分區(qū)過(guò)程:將比這個(gè)“基準(zhǔn)”大的數(shù)全放到“基準(zhǔn)”的右邊,小于或等于“基準(zhǔn)”的數(shù)全放到“基準(zhǔn)”的左邊;再對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)?;静僮骺焖倥判颌俜纸庠赗[low...high]中任選一個(gè)記錄,通常選第一個(gè)記錄R[low]作為“基準(zhǔn)”存放到基準(zhǔn)變量pivot中,以此基準(zhǔn)將當(dāng)前無(wú)序區(qū)劃分為左、右兩個(gè)子區(qū)間R[low...pivot?1]和R[pivot+1...high]。②求解通過(guò)遞歸調(diào)用快速排序?qū)ψ蟆⒂易訁^(qū)間R[low...pivot?1]和R[pivot+1...high]進(jìn)行快速排序。③組合因?yàn)楫?dāng)“求解”步驟中的兩個(gè)遞歸調(diào)用結(jié)束時(shí),其左、右兩個(gè)子區(qū)間已有序,因此對(duì)快速排序而言,“組合”步驟無(wú)須做什么,可看作是空操作。分治法處理步驟快速排序設(shè)置兩個(gè)變量i、j,開(kāi)始時(shí):i=0,j=n–1;以第一個(gè)元素為關(guān)鍵數(shù)據(jù),賦給key;從j開(kāi)始向前搜索,找到第一個(gè)小于key的值R[j],將R[j]和R[i]互換;再?gòu)膇開(kāi)始向后搜索,找到第一個(gè)大于key的R[i],將R[i]和R[j]互換;重復(fù)上述兩步

,直到i==j;確保序列中所有元素都與key比較過(guò)了,且key的左邊全部是比key小的,key的右邊全部是比key大的。算法描述快速排序示例【例6-5】假定有原始序列:70,75,69,32,88,18,16,58,采用快速排序的方法對(duì)其進(jìn)行排序。假定每次基準(zhǔn)都是選擇待排序列或子序列的第一個(gè)元素,則第一趟快速排序的過(guò)程是:快速排序pivot初始關(guān)鍵字707569328818165875>70R[j]=R[i]j--換方向搜索直到找到第一個(gè)小于基準(zhǔn)5875693288181675第從前往后搜索大于基準(zhǔn)的,交換

4次復(fù)制從后往前搜索小于基準(zhǔn)的,交換第5次復(fù)制i>=j,循環(huán)結(jié)束完成1趟排序

ij58<70

R[i]=R[j]

i++換方向搜索直到找到第一個(gè)大于基準(zhǔn)從后往前搜索小于基準(zhǔn)的,交換第1次復(fù)制707569328818165858j5875693288181658從前往后搜索大于基準(zhǔn)的,交換第2次復(fù)制i75從后往前搜索小于基準(zhǔn)的,交換第3次復(fù)制ij16<70

R[i]=R[j]

i++換方向搜索直到找到第一個(gè)大于基準(zhǔn)16Ij

581669328818167588>70R[j]=R[i]j--換方向搜索直到找到第一個(gè)小于基準(zhǔn)ij88

581669328818887518<70

R[i]=R[j]

i++換方向搜索直到找到第一個(gè)大于基準(zhǔn)ji185816693218188875I==j,搜索結(jié)束,R[j]=基準(zhǔn)70示例【例6-5】假定有原始序列:70,75,69,32,88,18,16,58,采用快速排序的方法對(duì)其進(jìn)行排序。對(duì)該序列進(jìn)行快速排序經(jīng)過(guò)了4趟,每趟的排序結(jié)果如下:快速排序第1趟排序5816693218[70]8875初始關(guān)鍵字7075693288181658第2趟排序181632[58]69[70]8875第3趟排序16[18]32[58]69[70]8875第4趟排序16[18]32[58]69[70]75[88]排序結(jié)果[1618325869707588]算法實(shí)現(xiàn)快速排序//使用快速排序方法實(shí)現(xiàn)整形數(shù)據(jù)元素排序publicstaticvoidquickSort(int[]a){intlen;if(a==null||(len=a.length)==0||len==1){return;}quickSort(a,0,len-1);//調(diào)用快速排序核心算法}//快排核心算法,遞歸實(shí)現(xiàn)publicstaticvoidquickSort(int[]array,intleft,intright){intbase=array[left];//base中存放基準(zhǔn)數(shù) inti=left,j=right; while(i!=j){//先從右邊往左找,直到找到比base值小的數(shù)while(array[j]>=base&&i<j){j--;}//再?gòu)淖笸疫呎?,直到找到比base值大的數(shù) while(array[i]<=base&&i<j){i++;}//循環(huán)結(jié)束,找到位置或者(i>=j),交換兩個(gè)數(shù)位置if(i<j){ inttmp=array[i];array[i]=array[j];array[j]=tmp;}}//將基準(zhǔn)數(shù)放到中間的位置(基準(zhǔn)數(shù)歸位)array[left]=array[i];array[i]=base;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論