版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java排序算法1)分類:1)插入排序(直接插入排序、希爾排序)2)交換排序(冒泡排序、快速排序)3)選擇排序(直接選擇排序、堆排序)4)歸并排序5)分配排序(箱排序、基數(shù)排序)所需輔助空間最多:歸并排序所需輔助空間最少:堆排序平均速度最快:快速排序不穩(wěn)定:快速排序,希爾排序,堆排序。1)選擇排序算法的時(shí)候1.數(shù)據(jù)的規(guī)模 ; 2.數(shù)據(jù)的類型 ; 3.數(shù)據(jù)已有的順序 一般來(lái)說(shuō),當(dāng)數(shù)據(jù)規(guī)模較小時(shí),應(yīng)選擇直接插入排序或冒泡排序。任何排序算法在數(shù)據(jù)量小時(shí)基本體現(xiàn)不出來(lái)差距。 考慮數(shù)據(jù)的類型,比如如果全部是正整數(shù),那么考慮使用桶排序?yàn)樽顑?yōu)。 考慮數(shù)據(jù)已有順
2、序,快排是一種不穩(wěn)定的排序(當(dāng)然可以改進(jìn)),對(duì)于大部分排好的數(shù)據(jù),快排會(huì)浪費(fèi)大量不必要的步驟。數(shù)據(jù)量極小,而起已經(jīng)基本排好序,冒泡是最佳選擇。我們說(shuō)快排好,是指大量隨機(jī)數(shù)據(jù)下,快排效果最理想。而不是所有情況。3)總結(jié):按平均的時(shí)間性能來(lái)分: 1)時(shí)間復(fù)雜度為O(nlogn)的方法有:快速排序、堆排序和歸并排序,其中以快速排序?yàn)樽詈茫?#160; 2)時(shí)間復(fù)雜度為O(n2)的有:直接插入排序、起泡排序和簡(jiǎn)單選擇排序,其中以直接插入為最好,特別是對(duì)那些對(duì)關(guān)鍵字近似有序的記錄序列尤為如此;
3、160; 3)時(shí)間復(fù)雜度為O(n)的排序方法只有,基數(shù)排序。當(dāng)待排記錄序列按關(guān)鍵字順序有序時(shí),直接插入排序和起泡排序能達(dá)到O(n)的時(shí)間復(fù)雜度;而對(duì)于快速排序而言,這是最不好的情況,此時(shí)的時(shí)間性能蛻化為O(n2),因此是應(yīng)該盡量避免的情況。簡(jiǎn)單選擇排序、堆排序和歸并排序的時(shí)間性能不隨記錄序列中關(guān)鍵字的分布而改變。按平均的空間性能來(lái)分(指的是排序過(guò)程中所需的輔助空間大小): 1) 所有的簡(jiǎn)單排序方法(包括:直接插入、起泡和簡(jiǎn)單選擇)和堆排序的空間復(fù)雜度為O(1); 2) 快速排序?yàn)镺(lo
4、gn ),為棧所需的輔助空間; 3) 歸并排序所需輔助空間最多,其空間復(fù)雜度為O(n ); 4)鏈?zhǔn)交鶖?shù)排序需附設(shè)隊(duì)列首尾指針,則空間復(fù)雜度為O(rd )。排序方法的穩(wěn)定性能: 1) 穩(wěn)定的排序方法指的是,對(duì)于兩個(gè)關(guān)鍵字相等的記錄,它們?cè)谛蛄兄械南鄬?duì)位置,在排序之前和 經(jīng)過(guò)排序之后,沒(méi)有改變。 2) 當(dāng)對(duì)多關(guān)鍵字的記錄序列進(jìn)行LSD方法排序時(shí),必須采用穩(wěn)定的排序方法。 &
5、#160; 3) 對(duì)于不穩(wěn)定的排序方法,只要能舉出一個(gè)實(shí)例說(shuō)明即可。 4) 快速排序,希爾排序和堆排序是不穩(wěn)定的排序方法。4)插入排序:包括直接插入排序,希爾插入排序。直接插入排序: 將一個(gè)記錄插入到已經(jīng)排序好的有序表中。 1, sorted數(shù)組的第0個(gè)位置沒(méi)有放數(shù)據(jù)。 2,從sorted第二個(gè)數(shù)據(jù)開始處理:
6、; 如果該數(shù)據(jù)比它前面的數(shù)據(jù)要小,說(shuō)明該數(shù)據(jù)要往前面移動(dòng)。 首先將該數(shù)據(jù)備份放到 sorted的第0位置當(dāng)哨兵。 然后將該數(shù)據(jù)前面那個(gè)數(shù)據(jù)后移。 然后往前搜索,找插入位置。
7、0; 找到插入位置之后講 第0位置的那個(gè)數(shù)據(jù)插入對(duì)應(yīng)位置。O(n*n), 當(dāng)待排記錄序列為正序時(shí),時(shí)間復(fù)雜度提高至O(n)。希爾排序(縮小增量排序 diminishing increment sort):先將整個(gè)待排記錄序列分割成若干個(gè)子序列分別進(jìn)行直接插入排序,待整個(gè)序列中的記錄基本有序時(shí),再對(duì)全體記錄進(jìn)行一次直接插入排序。插入排序Java代碼:public class InsertionSort / 插入排序:直接插入排序 ,希爾排序
8、 public void straightInsertionSort(double sorted) int sortedLen= sorted.length; for(int j=2;j<sortedLen;j+)
9、60; if(sortedj<sortedj-1) sorted0= sortedj;/先保存一下后面的那個(gè)
10、160; sortedj=sortedj-1;/ 前面的那個(gè)后移。 int insertPos=0;
11、0; for(int k=j-2;k>=0;k-) if(sortedk>sorted0)
12、60; sortedk+1=sortedk; else
13、60; insertPos=k+1;
14、 break;
15、60; sortedinsertPos=sorted0;
16、 public void shellInertionSort(double sorted, int inc)
17、int sortedLen= sorted.length; for(int j=inc+1;j<sortedLen;j+ ) if(sortedj<sortedj-inc)
18、0; sorted0= sortedj;/先保存一下后面的那個(gè) int insertPos=j;
19、; for(int k=j-inc;k>=0;k-=inc)
20、160; if(sortedk>sorted0)
21、160; sortedk+inc=sortedk;
22、0; /數(shù)據(jù)結(jié)構(gòu)課本上這個(gè)地方?jīng)]有給出判讀,出錯(cuò): if(k-inc<=0)&
23、#160; insertPos = k;
24、0; else
25、0; insertPos=k+inc; break;
26、0; &
27、#160; sortedinsertPos=sorted0;
28、; public void shellInsertionSort(double sorted) int incs=7,5,3,1; int num= incs.length;
29、 int inc=0; for(int j=0;j<num;j+) inc= incsj;
30、; shellInertionSort(sorted,inc);
31、 public static void main(String args) Random random= new Random(6); int arraysize= 21;
32、 double sorted=new doublearraysize; for(int j=1;j<arraysize;j+)
33、; sortedj= (int)(random.nextDouble()* 100);
34、60; InsertionSort sorter=new InsertionSort(); / sorter.straightInsertionSort(sorted);
35、0; sorter.shellInsertionSort(sorted); for(int j=1;j<sorted.length;j+)
36、; 面試穿什么,這里找答案!5)交換排序:包括冒泡排序,快速排序。冒泡排序法:該算法是專門針對(duì)已部分排序的數(shù)據(jù)進(jìn)行排序的一種排序算法。如果在你的數(shù)據(jù)清單中只有一兩個(gè)數(shù)據(jù)是亂序的話,用這種算法就是最快的排序算法。如果你的數(shù)據(jù)清單中的數(shù)據(jù)是隨機(jī)排列的,那么這種方法就成了最慢的算法了。因此在使用這種算法之前一定要
37、慎重。這種算法的核心思想是掃描數(shù)據(jù)清單,尋找出現(xiàn)亂序的兩個(gè)相鄰的項(xiàng)目。當(dāng)找到這兩個(gè)項(xiàng)目后,交換項(xiàng)目的位置然后繼續(xù)掃描。重復(fù)上面的操作直到所有的項(xiàng)目都按順序排好??焖倥判颍和ㄟ^(guò)一趟排序,將待排序記錄分割成獨(dú)立的兩個(gè)部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。具體做法是:使用兩個(gè)指針low,high, 初值分別設(shè)置為序列的頭,和序列的尾,設(shè)置pivotkey為第一個(gè)記錄,首先從high開始向前搜索第一個(gè)小于pivotkey的記錄和pivotkey所在位置進(jìn)行交換,然后從low開始向后搜索第一個(gè)大于pivotkey的記錄和此時(shí)piv
38、otkey所在位置進(jìn)行交換,重復(fù)知道low=high了為止。交換排序Java代碼:public class ExchangeSort public void BubbleExchangeSort(double sorted) int sortedLen= sorted.length; for(int j=sortedLen;j>0;j-)
39、 int end= j; for(int k=1;k<end-1;k+) do
40、uble tempB= sortedk; sortedk= sortedk<sortedk+1?sortedk:sortedk+1; if(Math.abs(so
41、rtedk-tempB)>10e-6) sortedk+1=tempB;
42、160; public void QuickExchangeSortBackTrack(double sort
43、ed,int low,int high) if(low<high) int pivot= findPivot(sorted,low,high); QuickExchangeSortBac
44、kTrack(sorted,low,pivot-1); QuickExchangeSortBackTrack(sorted,pivot+1,high); public int findPivot(double sorted, int low, in
45、t high) sorted0= sortedlow; while(low<high) while
46、(low<high && sortedhigh>= sorted0)-high; sortedlow= sortedhigh; while(low<high && sortedlow<=sorted0)+low;
47、0; sortedhigh= sortedlow; sortedlow=sorted0; return low; &
48、#160; public static void main(String args) Random random= new Random(6); int arraysize= 21; do
49、uble sorted=new doublearraysize; for(int j=1;j<arraysize;j+) sortedj= (int
50、)(random.nextDouble()* 100);
51、 ExchangeSort sorter=new ExchangeSort(); / sorter.BubbleExchangeSort(sorted); sorter.QuickExchangeSor
52、tBackTrack(sorted, 1, arraysize-1); for(int j=1;j<sorted.length;j+) &
53、#160; 6)選擇排序:分為直接選擇排序, 堆排序直接選擇排序:第i次選取 i到array.Length-1中間最小的值放在i位置。堆排序:首先,數(shù)組里面用層次遍歷的順序放一棵完全二叉樹。從最后一個(gè)非終端結(jié)點(diǎn)往前面調(diào)整,直到到達(dá)根結(jié)點(diǎn),這個(gè)時(shí)候除根節(jié)點(diǎn)以外的所有非終端節(jié)點(diǎn)都已經(jīng)滿足堆得條件了,于是需要調(diào)整根節(jié)點(diǎn)使得整個(gè)樹滿足堆得條件,于是從根節(jié)點(diǎn)開始,沿著它的兒子們往下面走(最大堆沿著最大的兒子走,最小堆沿著最小的兒子走)。 主程序里面
54、,首先從最后一個(gè)非終端節(jié)點(diǎn)開始調(diào)整到根也調(diào)整完,形成一個(gè)heap, 然后將heap的根放到后面去(即:每次的樹大小會(huì)變化,但是 root都是在1的位置,以方便計(jì)算兒子們的index,所以如果需要升序排列,則要逐步大頂堆。因?yàn)楦?jié)點(diǎn)被一個(gè)個(gè)放在后面去了。 降序排列則要建立小頂堆)代碼中的問(wèn)題: 有時(shí)候第2個(gè)和第3個(gè)順序不對(duì)(原因還沒(méi)搞明白到底代碼哪里有錯(cuò))選擇排序Java代碼:public class SelectionSort public void straitSelectionSort(double sorted) &
55、#160; int sortedLen= sorted.length; for(int j=1;j<sortedLen;j+) int jMin= getMinIndex(sorted,j);
56、60; exchange(sorted,j,jMin); public void exchange(double sorted,int i,int j) int sortedLen= sorted.length;
57、 if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0) double temp= sortedi;
58、60; sortedi=sortedj; sortedj=temp; public int getMinIndex(double sorted, int i)
59、60; int sortedLen= sorted.length; int minJ=1; double min= Double.MAX_VALUE; for(int j=i;j<sortedLe
60、n;j+) if(sortedj<min) min= sortedj;
61、0; minJ= j; return minJ;
62、60; public void heapAdjust(double sorted,int start,int end) if(start<end) double temp= sortedstart;/
63、0; 這個(gè)地方j(luò)<end與課本不同,j<=end會(huì)報(bào)錯(cuò): for(int j=2*start;j<end;j *=2) if(j+1<end && s
64、ortedj-sortedj+1>10e-6) +j;
65、; if(temp<=sortedj) break;
66、 sortedstart=sor
67、tedj; start=j;
68、160; sortedstart=temp; public void heapSelectionSort(double sorted) int sortedLen = sorted.length;&
69、#160; for(int i=sortedLen/2;i>0;i-) heapAdjust(sorted,i,sortedLen);
70、 for(int i=sortedLen;i>1;-i) exchange(sorted,1,i);
71、 heapAdjust(sorted,1,i-1);
72、; public static void main(String args) Random random= new Random(6); int arraysize=9; double so
73、rted=new doublearraysize; for(int j=1;j<arraysize;j+) sortedj= (int)(rando
74、m.nextDouble()* 100); &
75、#160; SelectionSort sorter=new SelectionSort(); / sorter.straitSelectionSort(sorted); sorter.heapSelectionSort(sorted);
76、 for(int j=1;j<sorted.length;j+)
77、 面試穿什么,這里找答案!7)歸并排序:將兩個(gè)或兩個(gè)以上的有序表組合成一個(gè)新的有序表。歸并排序要使用一個(gè)輔助數(shù)組,大小跟原數(shù)組相同,遞歸做法。每次將目標(biāo)序列分解成兩個(gè)序列,分別排序兩個(gè)子序列之后,再將兩個(gè)排序好的子序列merge到一起。歸并排序Java代碼:public class MergeSort private double bridge;/輔
78、助數(shù)組 public void sort(double obj) if (obj = null) throw new NullPointerException("The param can not be null!");
79、 bridge = new doubleobj.length; / 初始化中間數(shù)組 mergeSort(obj, 0, obj.length - 1); / 歸并排序 bridge = null;
80、160; private void mergeSort(double obj, int left, int right) if (left < right) int center = (left + right) / 2;
81、 mergeSort(obj, left, center); mergeSort(obj, center + 1, right); merge(obj, left, center, right);
82、0; private void merge(double obj, int left, int center, int right) int mid = center + 1; int third = left;
83、 int tmp = left; while (left <= center && mid <= right) / 從兩個(gè)數(shù)組中取出小的放入中間數(shù)組 if (objleft-objmid<=10e-6)
84、160; bridgethird+ = objleft+; else bridget
85、hird+ = objmid+; / 剩余部分依次置入中間數(shù)組 while (mid <= right)
86、60; bridgethird+ = objmid+; while (left <= center) bridgethird
87、+ = objleft+; / 將中間數(shù)組的內(nèi)容拷貝回原數(shù)組 copy(obj, tmp, right); private void copy(double obj, int left, int right)
88、160; while (left <= right) objleft = bridgeleft; left+; &
89、#160; public static void main(String args) Random random = new Random(6); int arraysize = 10;
90、 double sorted = new doublearraysize; for (int j = 0; j < arraysize; j+) sortedj = (int) (random.nextDou
91、ble() * 100); MergeSort sorter = new MergeSort();
92、0; sorter.sort(sorted); for (int j = 0; j < sorted.length; j+)
93、; 8)基數(shù)排序:使用10個(gè)輔助隊(duì)列,假設(shè)最大數(shù)的數(shù)字位數(shù)為 x, 則一共做 x次,從個(gè)位數(shù)開始往前,以第i位數(shù)字的大小為依據(jù),將數(shù)據(jù)放進(jìn)輔助隊(duì)列,搞定之后回收。下次再以高一位開始的數(shù)字位為依據(jù)。以Vector作輔助隊(duì)列,基數(shù)排序的Java代碼:public class RadixSort
94、60; private int keyNum=-1; private Vector<Vector<Double>> util; public void distribute(double sorted, int nth) &
95、#160; if(nth<=keyNum && nth>0) util=new Vector<Vector<Double>>(); for(int j=0;j<10;j+)
96、; Vector <Double> temp= new Vector <Double>(); util.add(temp);
97、0; for(int j=0;j<sorted.length;j+)
98、60; int index= getNthDigit(sortedj,nth); util.get(index).add(sortedj); &
99、#160; public int getNthDigit(double num,int nth) String nn= Integer.toString(int)num); int len= nn.
100、length(); if(len>=nth) return Character.getNumericValue(nn.charAt(len-nth); else
101、 return 0; public void collect(double sorted)
102、; int k=0; for(int j=0;j<10;j+) int len= util.get(j).size(); if(len>0) for(int i=0
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)分線筒數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年財(cái)務(wù)專用打印機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年玉米葡萄糖母液項(xiàng)目可行性研究報(bào)告
- 2025年水質(zhì)測(cè)試劑項(xiàng)目可行性研究報(bào)告
- 2025年木皮粘合劑項(xiàng)目可行性研究報(bào)告
- 2025年中國(guó)茶籽餅市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)汽車特種橡膠市場(chǎng)調(diào)查研究報(bào)告
- 2025至2030年?duì)C金烙糊兩用機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 2025年中國(guó)微型預(yù)接線限位開關(guān)市場(chǎng)調(diào)查研究報(bào)告
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)集錦
- CNAS實(shí)驗(yàn)室評(píng)審不符合項(xiàng)整改報(bào)告
- 農(nóng)民工考勤表(模板)
- 承臺(tái)混凝土施工技術(shù)交底
- 臥床患者更換床單-軸線翻身
- 計(jì)量基礎(chǔ)知識(shí)培訓(xùn)教材201309
- 中考英語(yǔ) 短文填詞、選詞填空練習(xí)
- 一汽集團(tuán)及各合資公司組織架構(gòu)
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 初一至初三數(shù)學(xué)全部知識(shí)點(diǎn)
- 新課程理念下的班主任工作藝術(shù)
- (完整版)企業(yè)破產(chǎn)流程圖(四張)
評(píng)論
0/150
提交評(píng)論