8.二維數(shù)組和常見排序算法講解_第1頁
8.二維數(shù)組和常見排序算法講解_第2頁
8.二維數(shù)組和常見排序算法講解_第3頁
8.二維數(shù)組和常見排序算法講解_第4頁
8.二維數(shù)組和常見排序算法講解_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄1?二維數(shù)組 1.1概念 1.2.二維數(shù)組的定義1.3二維數(shù)組的應(yīng)用2.常見的排序算法……2.1排序算法的分類宜2.2接插入排序?希2.3爾排序 9915169915162.5堆排序 2.6目泡排序 2.7快速排序……這次課我們學(xué)習(xí)數(shù)組中的二維數(shù)組.和一些常見的排序算法。在理解上不容易理解.希望大家耐心學(xué)習(xí)??简?zāi)銈冞壿嬎季S的時候到了~~學(xué)算法.要冷靜中帶一點嗨'們邏輯思維的時候到了1.二維數(shù)組1.1概念所謂二維的維,抬的是一個“維度” ?通俗的講.如果一維是單一的一條線,那么二維可以看作是一個面。例如,可以用圖來對比一下它們:一維數(shù)組:1H341567二維數(shù)組:11b45172Is4567124156171234567也可對于二維數(shù)組.我們可以理解在一維數(shù)組當中, 每一個格子里又存了一個一維數(shù)組。也可以干脆形象一點的理解.二維數(shù)組類似于我們畫表格的 n行n列1.2.二維數(shù)組的定義方式1:int[][]arr=newint[5][2]:

定義名稱為arr的二維數(shù)組,我們簡瑕點理解成 5行2列。但果能夠理解為大小為 5的一維數(shù)組里,每個格子放了一個大小為2的一維數(shù)組會更好些,因為有利于對內(nèi)存的理解。對第一行的第一個格子賦值的寫法為:arr[O][0]=80;(注盤?數(shù)組的角標依然是從0開始)方式2:int口口arr=newint[3][];定義了一個名稱為arr的二維數(shù)組,定義了3行.但是沒有定義列。如果我們用列的思維去理解.這“行n里就不容易理解了,為什么它可以只定義了行卻先不定義列?里需要用回格子的思維,定義了3個格子,所以這但每個格子里放多大的一維數(shù)組先不定義。就好理解了。這樣如圖:神奇的是.每個格子看上圖?每一個格子里再放入一維數(shù)組.是不是就成了二維數(shù)組?里可以放不同大小的一維數(shù)組。如圖:神奇的是.每個格子arr[0]123aiTEl]□airir[2]12圖比較1L不要嫌棄它用代碼體現(xiàn)出來就是:arr[O]=newint[3]:arr[l]=newint[l]:arr[2]=newint[2];方式3:intDDarr={{1,2},{8,3,1},{2}};第三種方式最為宜觀.定義了大小為3第三種方式最為宜觀.定義了大小為3的二維數(shù)組.然后每個格子里放著不同大小的一維數(shù)組。但這種方式比絞死板?1.3二維數(shù)組的應(yīng)用實際開發(fā)當中,二維數(shù)組主要用于一些簡單的小的數(shù)據(jù)的分類存儲需求:將軟件?例如,有這樣一個部.產(chǎn)品部,財務(wù)部門本月四周的財務(wù)數(shù)據(jù)存到數(shù)組里。很顯然.我們可以用一維數(shù)組?將3個部門的數(shù)據(jù)都存到里邊。但是這樣太雜亂,難以區(qū)分哪些數(shù)據(jù)分別輸入哪個部門,如果部門有10個.那顯然一維數(shù)組里的這一堆數(shù)據(jù)就更混亂。所以.我們就需要用二維數(shù)組:定義一個大小為3個二維數(shù)組,arr[0]用來存軟件部,arr[l]用來存產(chǎn)品部,你⑵用來存財務(wù)部?那么有同學(xué)會何我怎么記得住哪個下標屆于什么部門。這個簡址,用變童標識就可以了,例如定義軟件的整型變竝intruanJianBu=0:然后再數(shù)組下表中引用它:arrtruanJianBu]={2,3,6};這樣不就一目了然了么?同志們.學(xué)完了以上章節(jié),java的入門基礎(chǔ)語法知識就告一段落了。不知道你們感觸如何呢?如果你堅持完成了每一次的課后練習(xí),相信你已經(jīng)有所收獲 s接下來,要跟大家介紹一些常見的排序算法。算法,實際項目開發(fā)當中其實用的并不多用,但如果你立志將來往數(shù)據(jù)分析大牛方向連,還是要從點滴做起.把算法學(xué)好。2.常見的排序算法許先大家要理解,什么是算法。通俗的理解就是為了得到某個結(jié)果的一種計算方法,或者說是一種游戲規(guī)則,通過這些不同的規(guī)則我們能夠獲得同樣的結(jié)果。其次.要學(xué)會簡單對2個變竝進行?交換數(shù)值.tenp,垠簡單的方式是.設(shè)盤一個中間臨時變員例如inta=2:intb=3;如何將它們交換?接inta把3賦值給。把2賦值給b?有些同學(xué)說宜如果數(shù)值是=3:intb=2;不就可以了?不要這么嗨?? 用戶輸入的變員呢?常見的做法是設(shè)置一個中間變罐temp,然后tenp=a:a=b:b^tenp;這樣就達到了兩個變罐相互交換的效果。這方式雖然笨拙.但卻最容易看懂.也談不上耗內(nèi)存資源.開發(fā)中經(jīng)常使用。2.1排序算法的分類排序算法大致可分為以下幾類。(1) 插入排序^宜接插入排序?希爾排序目(2) 交換排序^泡排序.快速排序宜接選擇(3) 選擇排序:陽廝排廉潮罷排⑷序:基數(shù)排序我們這里先學(xué)習(xí)詢而3類.已經(jīng)足夠大家暢騰了殆直接插入排序宜接插入排序法主要思想類似于玩撲克牌時按從小到大整理牌的過程.第一趙比較最前面的2個數(shù).排序好。然后第二趟用第三個數(shù)與前而排序好的 2個數(shù)進行比較,進行插入排序:第三趟用第4個數(shù)與前面排序好的3個數(shù)進行比較?插入到他們當中去?以此類推。如圖:未排庫前:巴」30 27第一植:比較一張和第二匸氏.排原好匸4"第二越*加入第弱巳與排弼的前兩第三遇:m入第未排庫前:巴」30 27第一植:比較一張和第二匸氏.排原好匸4"第二越*加入第弱巳與排弼的前兩第三遇:m入第4帳「與援好的前3第四趟加入第5張,與排庫好的前4張進行排序17 50302717 27 3017冋3050for循環(huán)是最適合的了。用多2個動作:(1)for循環(huán)是最適合的了。用多2個動作:(1)加入第n張牌,(2)與怕面排序好的數(shù)值(我們稱之為有序數(shù)列)進行比較所以,我們可以用2個for循環(huán)來寫這個算法:

低乂訂掰曲就1啄河J逼赭從有序飄曲乾峠敦粉嫌懺幅山械較爛訛冊時瑞聊%虻護皮朋于咗拙徳漩劃publiccl*ssIflSflrtSoptputlie"oidetIni5ertSort[)\intarf[]:仏血巧込forfinti=J:iKr\hngth:iu){inti="適廚號芽曲專読測半艇軸剖于訂鵝申滁飩對?晞交翅浦飆輕憔環(huán)感疔離.1■1:teipId叩[i]:for"込-鎬昶筑注卷耳叩不劭二啊刃眉型黔止箕二訓(xùn)鋼了.毗謝肚岬輜.転貯是下標為訊的血因疵恃止仙(護瀚訓(xùn)冊r[j][jT2也洎圾了1-fiar(inti:6ji〈drr?length;14*+){Sytt5i.out.〔H'iiitln{arr[i])jpublicstaticraidinRtrirgdPg[]){IdSflrlSbr*isneuInsert*ort[}:i,getIns?r*Sopt{):圖比較小.看不淸的同學(xué)放大文檔就可以看淸楚了。有些同學(xué)可能會何,為什么第二層循環(huán)里. t?P變量若不小于arr[j].就會停止這一層的循環(huán)。舉個列子就明白了, 假設(shè)有序數(shù)列為 1,&7加入一個比較數(shù)字為 &這個8相當于待比較的temp變顯,本身,1,5,7就是一個從小到大排好序的數(shù)列,那么是不是只要用8與這個數(shù)列的垠厲一位開始比就可以省事了呢?2.3希爾排序希爾排序也是插入排序的一種.可以看作是宜接插入排序的優(yōu)化。為什么說它優(yōu)化了宜接插入排序,因為希爾排序采用了先分組,再在各組里進彳j?插入排序。希爾排序的玩法是這樣的:先取一個小于n的整數(shù)dl作為第一個增竝.把文件的全部記錄都分組。即所有 距離為dl倍數(shù)的都放在同一組中,現(xiàn)在各組內(nèi)進彳『“宜接插入排序"°然后.取第二個增竝d2<dl,重復(fù)進行增竝為dl時的做法,直到增呈為1也就是說所有數(shù)都已經(jīng)放在了同一組中進行排序之后終止。通常增量d?取的是數(shù)組長度的二分之通常增量d?取的是數(shù)組長度的二分之1.即所eulength/2運算??赐晟厦孢@段?相信大部分同學(xué)都葉.血了吧看完上面這段?相信大部分同學(xué)都葉.血了吧??作為要畫圖的我?也有股血液從胸口涌38ft理0第-翻廂:蹣方昶疑臣/2R38ft理0第-翻廂:蹣方昶疑臣/2R即曰■E20 303FS!同一卒繪里.瞞齊卒坦進廳M丁綁入取此時商軸2卒鉢S為1?逞杠時話它I門全白隔分判了一卒輕"也就是說討37/fTfia3S.W5Java代碼實現(xiàn)如下:"初始比一魚奴組"定文絡(luò)時兗"初始比一魚奴組"定文絡(luò)時兗XtetnP"先將歎蝕苗隹寶展克緒水方區(qū)對其進卩強2的廠當nTii數(shù)婆卄昴排*并潔宦抽腔數(shù)if(d=lj{brE

dk:publicvoidgetShellSortDfInta□={迪3町幼巧5叫廻19}:inttetnp=0:in:d-anlength:Intcount-0jibile(true){“昇于理定分至?xí)r聲坦當中第一個釵的下甬標“匡于壽定分生加縣至當中最怎一個就豹丁角標M甲干容定開始對毎孟運庁武茨擠A時的第一卒數(shù)所角標"先將寫組3中說[■個配吐a蛤葩時變雖詢P肓更比S之?后的交姜操作“幵始進行宜慕插入比亂此處的恩想史宜婆插入排字的雙法息想相孔d=d/2:Svs:ea.cu:'prLn:ln(*d**id):for{in:E=0:j^djXH){伽(sti=i-Kl:Ka,length:H=d)fintj=H:tEnip■a[i]jfor(:]>=Otiteap<a[jl:j-=d)(count4+:Systea.outpdrit丄n("鶴"isunt*里徘序.嚀臭為:"):for{Inti=0;io.len*h31H(5y或即tou:*prdntln心[i]);"當訶號為1時?£]階有載都茂分彳了[?一組連匚旦搖撮h疙F戒開詰束第丄趟排序后結(jié)果為:17302719503820d=l第2趟排序后結(jié)果為;17192027303850要想理解希爾排序.杵先要理解好直接插入排序.希爾排序改進了宜接插入排序時每次只能將數(shù)據(jù)移動一位的低效做法。但希爾排序是不穩(wěn)定的.肖有個相同的數(shù)字被分在不同的組里時,可能會被多次移動。英穩(wěn)定性會就被打亂。羽句2”羽句2”,沒錯.那個是留給大家的作業(yè).只要理解了算法,就能填寫完整。圖丑見諒…而堆排序是利用了樹半中的“完全二叉樹”所謂完全二叉樹,就是抬除了最后一層外.每一層上的結(jié)點數(shù)均達到了最大值;在最后一層上只缺了若干個右結(jié)點(或者說右孩子〉如圖:圖丑見諒…而堆排序是利用了樹半中的“完全二叉樹”所謂完全二叉樹,就是抬除了最后一層外.每一層上的結(jié)點數(shù)均達到了最大值;在最后一層上只缺了若干個右結(jié)點(或者說右孩子〉如圖:即有左孩子又有右孩子大家看.它賤后一層少了一個右孩子.而其他層都是滿的.即有左孩子又有右孩子如果是用數(shù)組來存儲樹結(jié)構(gòu)的話.要理淸下腳標存的分別是什么 ?假設(shè)某個元素為用號為X,我們用n來表示元素的總數(shù),那么X的范用是0到n-1。如果這個元素有左孩子,那么左孩子的位置是2X+1:如果有右孩子,右孩子的位蜀是 2X+2,如果有父結(jié)點點?(例如途中1號就為2,3的父結(jié)點)同時我們又分為垠興堆和最小堆,垠興堆的任總子樹根節(jié)點不小于任總子結(jié)點.最小堆的根節(jié)點不大于任盤子結(jié)點。(這句話是堆笄法的桔髓〉子結(jié)點。而堆排序也可以看作是目泡.選擇排序的一種類似算法,只是選取最大元素的過程就是用最大堆。而且城大堆的最大元素一定在第0位置,構(gòu)建好堆之后?交換0位盤元素與頂.我們通過畫圖來模擬這個過程:例如我們要對數(shù)組{16,7,3,20,17,8},進行堆排序。那么:步驟一構(gòu)建完全二叉樹.得到大值.來(就是根據(jù)完全二叉樹除了垠后一層之外,貳他層結(jié)點數(shù)達到垠構(gòu)建完全二叉樹.得到大值.來(就是根據(jù)完全二叉樹除了垠后一層之外,貳他層結(jié)點數(shù)達到垠進行構(gòu)建)步驟二:構(gòu)造初始堆.世任何誹葉節(jié)點的數(shù)值不人干 或者不小W生右孩子節(jié)點的數(shù)值(這里我們只考慮后一種悄況:任何一非葉節(jié)點的數(shù)值不小干其左右孩子節(jié)點的調(diào)整之后:步驟三:開始排序也就是說此時數(shù)組里的存儲是這樣的:20 17 8 7 16我們可以看出,通過步驟二之后,頂點的肖定是所有數(shù)里而垠大的數(shù)?此申,便可將它與最后一個數(shù)字的位宜交換(因為從小到大排序的話肯定垠百一格是垠大了嘛〉?因此就會變成:37371620此時可以將20結(jié)點去掉了。剩下:但是這個時候,又不滿足父結(jié)點要大于左右結(jié)點了?怎么辦?再次調(diào)整為:8731720好了.這回垠頂上的17是垠大了吧.繼續(xù)將它與垠后一個結(jié)點交換,并放到數(shù)組里數(shù)組里的樣子已經(jīng) ?此時變成:去掉17號,樹的樣子變成了:好了.又不滿足父結(jié)點要大于左右結(jié)點了?再次調(diào)整.然后再把頂部最大的選出來就這樣來回折騰,嵌后就能將這串數(shù)給排序好 ?經(jīng)過上面幾段文字和圖畫.想必大家已經(jīng)快吐血了吧。那么用代碼怎么實現(xiàn)呢?不要害怕.只要理清了思路,寫代碼只是在鍵盤上敲字母的車怙,哈哈。思路如下:(1) 構(gòu)建最大堆選(2) 擇末尾項,由并與最頂上的元素交換 (即下標為o的元素)()于步驟2寫一可能會破壞了垠大堆的性質(zhì),即最頂上的已經(jīng)不再是最大的元素.需要maxHeap"個方法 來調(diào)整堆?然后再垂復(fù)第二步 ?而maxHeap>就是整個算法的核心方法定會有很犬收獲!在看代碼之前,如果對自己有信心.大家不妨試試自己動手先挑戰(zhàn)一下,

定會有很犬收獲!publicvoidgotHeapSort(int[]a){intlen?a.length;〃定義變伍kn存話數(shù)組長度〃開始連堆〃定義變伍kn存話數(shù)組長度〃開始連堆“建家大堆〃交換堆頂和最后一個元素1:i++){bu訂dManHedp(dAlen*l*i):swap(djOjlen?1-i);for(int1-0:i<len:i++){System,out-printin(a[i]):交換堆頂和最后一個元素*/Publicvoidinttnpdatd[i:data[j swap(int(]■dataJnti,int j){ddtd[i];?data[j]: 后?個元素放到堆頂元素去=tnp;對數(shù)粗從0到雖后?個元素拘連垠大spublicvoidbuildHdnHedp(int[]data"intlastindex)(for(intiTaatlnd,x/2: 108ikidex/2"hi; 斷的結(jié)點"當k的左孩了存在時"保存?下k左孩于的下角▼hile(k?2+l<-lastIndex){ 林“如果k的左接了小f-hstlndtx,戒說陰k結(jié)/intb-2*k+l: 在“如果k的右孩了牧犬,bfKfiif(b<lostlndex){if(ddtd[b]<datd[b+l]){b++:lf(data[k]<dat3[b]){“掃球k結(jié)宜小于Jtfe絞大的孩了塗鼠tt立筮他們s討ap(dataIIIb):keb;"并將b值K于匕繼瀆vhile毎環(huán)的下?次館環(huán)?車贛保證k結(jié)點的值大于其左右援了的兒點}clsc{break;1publicstaticvoidmain(Stringarg[]){inta[]-{16,7,3,20,17,8};HeapSorth=newHeapSort();h.getHeapSort(a);3731617202.6冒泡排序目泡排序的主要思想是對干當前還沒有排序好的所有數(shù),進行比自上而下對相鄰的兩個數(shù)依次較和調(diào)整.讓較大的數(shù)往下沉.較小的數(shù)往上目。這個現(xiàn)象。 這樣一來就很形象的體現(xiàn)出了目泡需要大家注總的是:目泡排序是比較基礎(chǔ)的排序算法,出目泡排通常在公司面試時, 都會要求寫序.所以是必須要學(xué)握的算法。我們來看下面這個:第一趙冒泡:59H5920 3□ 59 20依次類推”2119例如圖中的數(shù)字3,就是不斷的從底部與它前面的數(shù)字比較,就交換。不只要比它前面的數(shù)字小,斷的往上目.那么寫成java代碼就是:publiI.classBubbleSortpublicvoidgetBubbleSort(){inta[]-{59,20,21,19,3};//左義臨時變雖temp〃比較的趟數(shù)比較次數(shù)inttemp=0;for(inti//左義臨時變雖temp〃比較的趟數(shù)比較次數(shù)temp=a[j];占[j]-a[j+l];a[j+l]-temp;fon(inti二Oji<?ulength;i++){Systern,out.pnintln(a[i]);publicstaticvoidriain(Stririgargs[J){BubbleSortb=neirBubbleSort0jb*get6ubbleSort0;冒泡排序還是比較容易理解.但它的效率不高 ?我們做這樣一個假設(shè).假設(shè)有一組數(shù)組是{1,234,5},它本身就是有序的.那么如果采用目泡.是不是同樣又要去一個一個的比較?那么我們需要用什么樣的方式可以優(yōu)化一下目泡排序?思考一下, 這個問題將留到作業(yè)讓大家解決.2.7快速排序主要的思想:選擇一個基準元素.常用的做法是選擇第一元素或者垠后一個元素.通過一趟掃描.將待排序的數(shù)組分成 2部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序之后的正確位垃.然后用同樣的方式遞歸的排序劃分的兩部分快速排序的思想理解起來是比較繞的.關(guān)鍵要理解基準數(shù)的作用 ?代碼如下:publicolusQuicksortpublicvoidi?tQdicfcSortCintf]a){quick(a)i■fon(inti=O;ivw.len丨丨h(huán);i**){S”t皿out.printlr(a[i))-publicvoidquick(int[ja2){lf(a2.lenrth>0){auickSontl{a2>0,32.ltnrthl);publicvoidQljiokSoptl(int[]list,Intlor>inthlth){if(low<high){intmiddle-t?tHlddl?(llstloYjhith)QulckSontlflist,lQw,iniddl?~l)5quickSortlflist^nidldle*4*!,high);"將數(shù)組進行一分為二"逮歸的對低住表進行胡E宇“速歸的對高位表進行排字"旬克前第一

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論