




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第Java快速排序與歸并排序及基數(shù)排序圖解示例目錄一、快速排序1、基本介紹2、代碼實(shí)現(xiàn)二、歸并排序1、基本介紹2、代碼實(shí)現(xiàn)三、基數(shù)排序1、基本介紹2、代碼實(shí)現(xiàn)
一、快速排序
1、基本介紹
以上面的數(shù)組為例分析快速排序。
首先要傳入三個(gè)值,數(shù)組arr[],最左邊下標(biāo)left,最右邊下標(biāo)right。然后將根據(jù)左右的下標(biāo)值計(jì)算出中間值mid。
我們要做的就是將左邊的值大于mid的放到右邊,將右邊小于mid的值放到左邊。
左右兩邊分別單獨(dú)循環(huán),左邊找到比mid大的數(shù),右邊找到比mid小的數(shù)。
兩邊分別找到符合條件的數(shù)后,進(jìn)行交換。
然后繼續(xù)比較并交換,此刻l和mid都指向3,r指向5。
這時(shí)需要進(jìn)行判斷,如果arr[l]等于mid則r--,如果arr[r]等于mid則l++。此時(shí)又進(jìn)行判斷arr[l]是否等于arr[r],等于則退出。第一輪就結(jié)束了。
第一次完以后,我們使用遞歸,遞歸會重復(fù)上面的操作,從而完成排序。
2、代碼實(shí)現(xiàn)
//參數(shù)傳入數(shù)組arr,最左邊的下標(biāo)left,最右邊的下標(biāo)right
publicstaticvoidquickSort(int[]arr,intleft,intright){
//分別用臨時(shí)變量代替
intl=left;
intr=right;
//中間的下標(biāo)
intmiddle=arr[(left+right)/2];
//臨時(shí)變量,用于交換數(shù)據(jù)
inttemp=0;
//進(jìn)行循環(huán),只要右邊的下標(biāo)l小于左邊的下標(biāo)r就進(jìn)行循環(huán)
while(lr){
//左邊l到中間middle單獨(dú)循環(huán),找到比middle大的值
while(arr[l]middle){
l+=1;
//中間middle到右邊r單獨(dú)循環(huán),找到比middle小的值
while(arr[r]middle){
r-=1;
//退出循環(huán),表示找到,不過先判斷l(xiāng)是否大于等于r
//滿足就可以退出循環(huán),不需要執(zhí)行下面的代碼了
if(l=r){
break;
//找到的數(shù)據(jù)進(jìn)行交換
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//此時(shí)進(jìn)行判斷,如果arr[l]等于middle則r--
if(arr[l]==middle){
r-=1;
//如果arr[r]等于middle則l++
if(arr[r]==middle){
l+=1;
//退出循環(huán),l會等于r,此時(shí)要將兩者移位,l進(jìn)行加一,r進(jìn)行減一
if(l==r){
l+=1;
r-=1;
//第一輪完成后進(jìn)行遞歸
//重復(fù)上面的方法,向左遞歸
if(leftr){
//r繼續(xù)往前移的,所以左下標(biāo)為left,右下標(biāo)為r
quickSort(arr,left,r);
//重復(fù)上面的操作,向右遞歸
if(rightl){
//l繼續(xù)往后移的,所以左下標(biāo)為l,右下標(biāo)為right
quickSort(arr,l,right);
}
二、歸并排序
1、基本介紹
2、代碼實(shí)現(xiàn)
?首先實(shí)現(xiàn)合并
publicstaticvoidmerger(int[]arr,intleft,intmid,intright,int[]temp){
inti=left;
intj=mid+1;
intt=0;//數(shù)組temp的下標(biāo)
//將arr數(shù)組按順序放入temp數(shù)組
while(i=midj=right){
//從中間分隔開,左邊和右邊相互比較
//如果左邊更小,先放入temp數(shù)組,否則右邊先放入
if(arr[i]arr[j]){
temp[t]=arr[i];
i++;
t++;
}else{
temp[t]=arr[j];
j++;
t++;
//有可能有一邊還沒放完,于是繼續(xù)循環(huán)放放入
//左邊沒放完
while(i=mid){
temp[t]=arr[i];
t++;
i++;
//右邊沒放完
while(j=right){
temp[t]=arr[j];
j++;
t++;
//將temp中數(shù)據(jù)拷入到arr
t=0;
intleftind=left;
//第一次(leftind,right)是(0,1)(2,3)(4,5)(6,7)
//第二次(leftind,right)是(0,3)(4,7)
//第三次(leftind,right)是(0,7)
while(leftind=right){
arr[leftind]=temp[t];
t++;
leftind++;
}
?分隔和合并進(jìn)行遞歸
publicstaticvoidmergerSort(int[]arr,intleft,intright,int[]temp){
//判斷
if(leftright){
//求出中間值
intmid=(left+right)/2;
//調(diào)用自己,向左遞歸
mergerSort(arr,left,mid,temp);
//調(diào)用自己,向右遞歸
mergerSort(arr,mid+1,right,temp);
//調(diào)用merger進(jìn)行合并
merger(arr,left,mid,right,temp);
}
三、基數(shù)排序
1、基本介紹
首先我們需要10個(gè)數(shù)組,分別對應(yīng)10個(gè)桶,每個(gè)桶有對應(yīng)的下標(biāo)。
然后按每個(gè)數(shù)的個(gè)位數(shù)大小放入對應(yīng)的桶中,放好后,按桶的順序依次取出。
第二次是看每個(gè)數(shù)的十位,不及十位的就當(dāng)做0,依舊是依次放入對應(yīng)的桶中,并按順序取出。
第三次是看每個(gè)數(shù)的百位,重復(fù)上面的操作,最后得到的就是有序的數(shù)組。
2、代碼實(shí)現(xiàn)
publicstaticvoidcardinalitySort(int[]arr){
//首先找到數(shù)組中最大數(shù)的位數(shù)
intmax=arr[0];
for(inti=1;iarr.length-1;i++){
if(arr[i]max){
max=arr[i];
intmaxLength=(max+"").length();
//定義10個(gè)桶,每個(gè)桶大小為數(shù)組大小
int[][]bucket=newint[10][arr.length];
//定義一個(gè)數(shù)組來表示每個(gè)桶存放的數(shù)據(jù)
int[]bucketcount=newint[10];
//n是用來進(jìn)行位數(shù)處理的
for(inti=1,n=1;i=maxLength;i++,n*=10){
for(intj=0;jarr.length;j++){
//對每位數(shù)進(jìn)行位處理,并放入桶中
intelentData=arr[j]/n%10;
放對應(yīng)的桶中,
bucketcount[elentData]表示對應(yīng)的桶的數(shù)據(jù),
假如第一個(gè)數(shù)為579,要放入bucketcount[9](第九個(gè)桶)的第一個(gè)位置,
默認(rèn)初始化為0,所以第一個(gè)數(shù)放入的位置是bucketcount[9]=0
bucket[elentData][bucketcount[elentData]]=arr[j];
//第一個(gè)數(shù)放完后,這個(gè)桶中數(shù)據(jù)進(jìn)行++,
//下次再放入這個(gè)桶時(shí),bucketcount[9]=1
bucketcount[elentData]++;
intindex=0;
//遍歷每一個(gè)桶
for(intk=0;kbucketcount.length;k++){
//第一次默認(rèn)為bucketcount[k]=0
//所以如果第一個(gè)數(shù)為零,就說明這個(gè)桶為空
if(buc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空貨運(yùn)業(yè)務(wù)中的冷鏈物流質(zhì)量控制考核試卷
- 自行車電助力技術(shù)發(fā)展趨勢考核試卷
- 談判口才訓(xùn)練談判口才技巧
- 貨幣經(jīng)紀(jì)公司交易系統(tǒng)操作技巧考核試卷
- 水產(chǎn)養(yǎng)殖技術(shù)培訓(xùn)與指導(dǎo)考核試卷
- 抖音直播運(yùn)營與規(guī)范指南
- 《三級公共政策分析教學(xué)課件》
- 室內(nèi)設(shè)計(jì)的程序與方法
- 《圍棋藝術(shù)》課件
- 巡察采購領(lǐng)用環(huán)節(jié)重點(diǎn)與經(jīng)驗(yàn)分享
- 項(xiàng)目經(jīng)理年度考核評價(jià)表
- 音樂神童莫扎特詳細(xì)介紹和作品欣賞課件
- 9E燃機(jī)系統(tǒng)培訓(xùn)演3.25
- 2022年山東省臨沂市中考生物試題及答案解析
- 《紅樓夢:金陵十二釵判詞賞析》示范PPT課件
- 起重信號工、司索工安全教育培訓(xùn)試題帶答案
- 廢舊塑料回收再生資源利用項(xiàng)目建議書
- 玻璃纖維生產(chǎn)工藝流程培訓(xùn)
- 無砟軌道底座板首件施工總結(jié)(最新)
- 作文紙模板帶字?jǐn)?shù)
- (完整word版)機(jī)械制造工藝學(xué)教案
評論
0/150
提交評論