Java排序算法_第1頁
Java排序算法_第2頁
Java排序算法_第3頁
Java排序算法_第4頁
Java排序算法_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java排序算法1)分類:1)插入排序(直接插入排序、希爾排序)2)交換排序(冒泡排序、快速排序)3)選擇排序(直接選擇排序、堆排序)4)歸并排序5)分配排序(箱排序、基數(shù)排序)所需輔助空間最多:歸并排序所需輔助空間最少:堆排序平均速度最快:快速排序不穩(wěn)定:快速排序,希爾排序,堆排序。1)選擇排序算法的時候1.數(shù)據(jù)的規(guī)模 ;  2.數(shù)據(jù)的類型 ;  3.數(shù)據(jù)已有的順序  一般來說,當數(shù)據(jù)規(guī)模較小時,應(yīng)選擇直接插入排序或冒泡排序。任何排序算法在數(shù)據(jù)量小時基本體現(xiàn)不出來差距。 考慮數(shù)據(jù)的類型,比如如果全部是正整數(shù),那么考慮使用桶排序為最優(yōu)。  考慮數(shù)據(jù)已有順

2、序,快排是一種不穩(wěn)定的排序(當然可以改進),對于大部分排好的數(shù)據(jù),快排會浪費大量不必要的步驟。數(shù)據(jù)量極小,而起已經(jīng)基本排好序,冒泡是最佳選擇。我們說快排好,是指大量隨機數(shù)據(jù)下,快排效果最理想。而不是所有情況。3)總結(jié):按平均的時間性能來分:     1)時間復(fù)雜度為O(nlogn)的方法有:快速排序、堆排序和歸并排序,其中以快速排序為最好;     2)時間復(fù)雜度為O(n2)的有:直接插入排序、起泡排序和簡單選擇排序,其中以直接插入為最好,特別是對那些對關(guān)鍵字近似有序的記錄序列尤為如此;  &#

3、160;  3)時間復(fù)雜度為O(n)的排序方法只有,基數(shù)排序。當待排記錄序列按關(guān)鍵字順序有序時,直接插入排序和起泡排序能達到O(n)的時間復(fù)雜度;而對于快速排序而言,這是最不好的情況,此時的時間性能蛻化為O(n2),因此是應(yīng)該盡量避免的情況。簡單選擇排序、堆排序和歸并排序的時間性能不隨記錄序列中關(guān)鍵字的分布而改變。按平均的空間性能來分(指的是排序過程中所需的輔助空間大?。?#160;    1) 所有的簡單排序方法(包括:直接插入、起泡和簡單選擇)和堆排序的空間復(fù)雜度為O(1);     2) 快速排序為O(lo

4、gn ),為棧所需的輔助空間;     3) 歸并排序所需輔助空間最多,其空間復(fù)雜度為O(n );     4)鏈式基數(shù)排序需附設(shè)隊列首尾指針,則空間復(fù)雜度為O(rd )。排序方法的穩(wěn)定性能:     1) 穩(wěn)定的排序方法指的是,對于兩個關(guān)鍵字相等的記錄,它們在序列中的相對位置,在排序之前和 經(jīng)過排序之后,沒有改變。     2) 當對多關(guān)鍵字的記錄序列進行LSD方法排序時,必須采用穩(wěn)定的排序方法。   &

5、#160; 3) 對于不穩(wěn)定的排序方法,只要能舉出一個實例說明即可。     4) 快速排序,希爾排序和堆排序是不穩(wěn)定的排序方法。4)插入排序:包括直接插入排序,希爾插入排序。直接插入排序: 將一個記錄插入到已經(jīng)排序好的有序表中。      1, sorted數(shù)組的第0個位置沒有放數(shù)據(jù)。      2,從sorted第二個數(shù)據(jù)開始處理:            

6、;  如果該數(shù)據(jù)比它前面的數(shù)據(jù)要小,說明該數(shù)據(jù)要往前面移動。              首先將該數(shù)據(jù)備份放到 sorted的第0位置當哨兵。              然后將該數(shù)據(jù)前面那個數(shù)據(jù)后移。              然后往前搜索,找插入位置。

7、0;             找到插入位置之后講 第0位置的那個數(shù)據(jù)插入對應(yīng)位置。O(n*n), 當待排記錄序列為正序時,時間復(fù)雜度提高至O(n)。希爾排序(縮小增量排序 diminishing increment sort):先將整個待排記錄序列分割成若干個子序列分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序。插入排序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;/先保存一下后面的那個                   &#

10、160;                 sortedj=sortedj-1;/ 前面的那個后移。                   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;/先保存一下后面的那個                                      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)課本上這個地方?jīng)]有給出判讀,出錯:                            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)交換排序:包括冒泡排序,快速排序。冒泡排序法:該算法是專門針對已部分排序的數(shù)據(jù)進行排序的一種排序算法。如果在你的數(shù)據(jù)清單中只有一兩個數(shù)據(jù)是亂序的話,用這種算法就是最快的排序算法。如果你的數(shù)據(jù)清單中的數(shù)據(jù)是隨機排列的,那么這種方法就成了最慢的算法了。因此在使用這種算法之前一定要

37、慎重。這種算法的核心思想是掃描數(shù)據(jù)清單,尋找出現(xiàn)亂序的兩個相鄰的項目。當找到這兩個項目后,交換項目的位置然后繼續(xù)掃描。重復(fù)上面的操作直到所有的項目都按順序排好。快速排序:通過一趟排序,將待排序記錄分割成獨立的兩個部分,其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。具體做法是:使用兩個指針low,high, 初值分別設(shè)置為序列的頭,和序列的尾,設(shè)置pivotkey為第一個記錄,首先從high開始向前搜索第一個小于pivotkey的記錄和pivotkey所在位置進行交換,然后從low開始向后搜索第一個大于pivotkey的記錄和此時piv

38、otkey所在位置進行交換,重復(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ù)組里面用層次遍歷的順序放一棵完全二叉樹。從最后一個非終端結(jié)點往前面調(diào)整,直到到達根結(jié)點,這個時候除根節(jié)點以外的所有非終端節(jié)點都已經(jīng)滿足堆得條件了,于是需要調(diào)整根節(jié)點使得整個樹滿足堆得條件,于是從根節(jié)點開始,沿著它的兒子們往下面走(最大堆沿著最大的兒子走,最小堆沿著最小的兒子走)。 主程序里面

54、,首先從最后一個非終端節(jié)點開始調(diào)整到根也調(diào)整完,形成一個heap, 然后將heap的根放到后面去(即:每次的樹大小會變化,但是 root都是在1的位置,以方便計算兒子們的index,所以如果需要升序排列,則要逐步大頂堆。因為根節(jié)點被一個個放在后面去了。 降序排列則要建立小頂堆)代碼中的問題: 有時候第2個和第3個順序不對(原因還沒搞明白到底代碼哪里有錯)選擇排序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;    這個地方j(luò)<end與課本不同,j<=end會報錯:              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)歸并排序:將兩個或兩個以上的有序表組合成一個新的有序表。歸并排序要使用一個輔助數(shù)組,大小跟原數(shù)組相同,遞歸做法。每次將目標序列分解成兩個序列,分別排序兩個子序列之后,再將兩個排序好的子序列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) / 從兩個數(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個輔助隊列,假設(shè)最大數(shù)的數(shù)字位數(shù)為 x, 則一共做 x次,從個位數(shù)開始往前,以第i位數(shù)字的大小為依據(jù),將數(shù)據(jù)放進輔助隊列,搞定之后回收。下次再以高一位開始的數(shù)字位為依據(jù)。以Vector作輔助隊列,基數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論