【 Java】各种排序算法

 关键字: java排序算法

Java各种排序算法
1)分类:

1)插入排序(直接插入排序、希尔排序)

2)交换排序(冒泡排序、快速排序)

3)选择排序(直接选择排序、堆排序)

4)归并排序

5)分配排序(箱排序、基数排序)

所需辅助空间最多:归并排序

所需辅助空间最少:堆排序

平均速度最快:快速排序

不稳定:快速排序,希尔排序,堆排序。

1)选择排序算法的时候

1.数据的规模 ;  2.数据的类型 ;  3.数据已有的顺序
一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。任何排序算法在数据量小时基本体现不出来差距。考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。  考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。数据量极小,而起已经基本排好序,冒泡是最佳选择。我们说快排好,是指大量随机数据下,快排效果最理想。而不是所有情况。

3)总结:

——按平均的时间性能来分:
     1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;
     2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特          别是对那些对关键字近似有序的记录序列尤为如此;
     3)时间复杂度为O(n)的排序方法只有,基数排序。
当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。
——按平均的空间性能来分(指的是排序过程中所需的辅助空间大小):
     1) 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);
     2) 快速排序为O(logn ),为栈所需的辅助空间;
     3) 归并排序所需辅助空间最多,其空间复杂度为O(n );
     4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。
——排序方法的稳定性能:
     1) 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和 经过排序之后,没有改变。
     2) 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。
     3) 对于不稳定的排序方法,只要能举出一个实例说明即可。
     4) 快速排序,希尔排序和堆排序是不稳定的排序方法。
4)插入排序:

包括直接插入排序,希尔插入排序。

直接插入排序: 将一个记录插入到已经排序好的有序表中。

      1, sorted数组的第0个位置没有放数据。

      2,从sorted第二个数据开始处理:

              如果该数据比它前面的数据要小,说明该数据要往前面移动。

              首先将该数据备份放到 sorted的第0位置当哨兵。

              然后将该数据前面那个数据后移。

              然后往前搜索,找插入位置。

              找到插入位置之后讲 第0位置的那个数据插入对应位置。

O(n*n), 当待排记录序列为正序时,时间复杂度提高至O(n)。

希尔排序(缩小增量排序 diminishing increment sort):先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。


插入排序Java代码:
Java代码 
Java代码 复制代码
  1. public class InsertionSort {      
  2.      
  3. //   插入排序:直接插入排序,希尔排序         
  4.      
  5.      public void straightInsertionSort(double [] sorted){      
  6.      
  7.          int sortedLen= sorted.length;      
  8.      
  9.          for(int j=2;j<sortedLen;j++){      
  10.      
  11.               if(sorted[j]<sorted[j-1]){      
  12.      
  13.                    sorted[0]= sorted[j];//先保存一下后面的那个                       
  14.      
  15.                    sorted[j]=sorted[j-1];// 前面的那个后移。      
  16.      
  17.                    int insertPos=0;      
  18.      
  19.                    for(int k=j-2;k>=0;k--){      
  20.      
  21.                        if(sorted[k]>sorted[0]){      
  22.      
  23.                             sorted[k+1]=sorted[k];      
  24.      
  25.                        }else{      
  26.      
  27.                             insertPos=k+1;      
  28.      
  29.                             break;      
  30.      
  31.                        }      
  32.      
  33.                    }                       
  34.      
  35.                    sorted[insertPos]=sorted[0];      
  36.      
  37.               }                  
  38.      
  39.          }             
  40.      
  41.      }         
  42.      
  43.      public void shellInertionSort(double [] sorted, int inc){      
  44.      
  45.          int sortedLen= sorted.length;      
  46.      
  47.          for(int j=inc+1;j<sortedLen;j++ ){      
  48.      
  49.               if(sorted[j]<sorted[j-inc]){      
  50.      
  51.                    sorted[0]= sorted[j];//先保存一下后面的那个      
  52.      
  53.                         
  54.      
  55.                    int insertPos=j;                     
  56.      
  57.                    for(int k=j-inc;k>=0;k-=inc){                          
  58.      
  59.                        if(sorted[k]>sorted[0]){      
  60.      
  61.                             sorted[k+inc]=sorted[k];                                
  62.      
  63.                             //数据结构课本上这个地方没有给出判读,出错:      
  64.      
  65.                             if(k-inc<=0){      
  66.      
  67.                                  insertPos = k;      
  68.      
  69.                             }      
  70.      
  71.                        }else{      
  72.      
  73.                             insertPos=k+inc;      
  74.      
  75.                             break;      
  76.      
  77.                        }      
  78.      
  79.                    }                       
  80.      
  81.                    sorted[insertPos]=sorted[0];                        
  82.      
  83.               }      
  84.      
  85.          }      
  86.      
  87.      }      
  88.      
  89.      public void shellInsertionSort(double [] sorted){      
  90.      
  91.          int[] incs={7,5,3,1};      
  92.      
  93.          int num= incs.length;      
  94.      
  95.               
  96.      
  97.          int inc=0;      
  98.      
  99.          for(int j=0;j<num;j++){      
  100.      
  101.               inc= incs[j];               
  102.      
  103.               shellInertionSort(sorted,inc);                 
  104.      
  105.          }             
  106.      
  107.      }         
  108.      
  109.      public static void main(String[] args) {      
  110.      
  111.          Random random= new Random(6);      
  112.      
  113.               
  114.      
  115.          int arraysize= 21;      
  116.      
  117.          double [] sorted=new double[arraysize];      
  118.      
  119.          System.out.print("Before Sort:");              
  120.      
  121.          for(int j=1;j<arraysize;j++){      
  122.      
  123.               sorted[j]= (int)(random.nextDouble()* 100);      
  124.      
  125.               System.out.print((int)sorted[j]+" ");      
  126.      
  127.          }         
  128.      
  129.          System.out.println();      
  130.      
  131.                         
  132.      
  133.          InsertionSort sorter=new InsertionSort();          
  134.      
  135. //       sorter.straightInsertionSort(sorted);      
  136.      
  137.          sorter.shellInsertionSort(sorted);      
  138.      
  139.               
  140.      
  141.          System.out.print("After Sort:");      
  142.      
  143.          for(int j=1;j<sorted.length;j++){      
  144.      
  145.               System.out.print((int)sorted[j]+" ");      
  146.      
  147.          }         
  148.      
  149.          System.out.println();      
  150.      
  151.      }      
  152.      
  153. }     
  154.   
  155. public class InsertionSort {   
  156.   
  157. //   插入排序:直接插入排序,希尔排序      
  158.   
  159.      public void straightInsertionSort(double [] sorted){   
  160.   
  161.          int sortedLen= sorted.length;   
  162.   
  163.          for(int j=2;j<sortedLen;j++){   
  164.   
  165.               if(sorted[j]<sorted[j-1]){   
  166.   
  167.                    sorted[0]= sorted[j];//先保存一下后面的那个                    
  168.   
  169.                    sorted[j]=sorted[j-1];// 前面的那个后移。   
  170.   
  171.                    int insertPos=0;   
  172.   
  173.                    for(int k=j-2;k>=0;k--){   
  174.   
  175.                        if(sorted[k]>sorted[0]){   
  176.   
  177.                             sorted[k+1]=sorted[k];   
  178.   
  179.                        }else{   
  180.   
  181.                             insertPos=k+1;   
  182.   
  183.                             break;   
  184.   
  185.                        }   
  186.   
  187.                    }                    
  188.   
  189.                    sorted[insertPos]=sorted[0];   
  190.   
  191.               }               
  192.   
  193.          }          
  194.   
  195.      }      
  196.   
  197.      public void shellInertionSort(double [] sorted, int inc){   
  198.   
  199.          int sortedLen= sorted.length;   
  200.   
  201.          for(int j=inc+1;j<sortedLen;j++ ){   
  202.   
  203.               if(sorted[j]<sorted[j-inc]){   
  204.   
  205.                    sorted[0]= sorted[j];//先保存一下后面的那个   
  206.   
  207.                      
  208.   
  209.                    int insertPos=j;                  
  210.   
  211.                    for(int k=j-inc;k>=0;k-=inc){                       
  212.   
  213.                        if(sorted[k]>sorted[0]){   
  214.   
  215.                             sorted[k+inc]=sorted[k];                             
  216.   
  217.                             //数据结构课本上这个地方没有给出判读,出错:   
  218.   
  219.                             if(k-inc<=0){   
  220.   
  221.                                  insertPos = k;   
  222.   
  223.                             }   
  224.   
  225.                        }else{   
  226.   
  227.                             insertPos=k+inc;   
  228.   
  229.                             break;   
  230.   
  231.                        }   
  232.   
  233.                    }                    
  234.   
  235.                    sorted[insertPos]=sorted[0];                     
  236.   
  237.               }   
  238.   
  239.          }   
  240.   
  241.      }   
  242.   
  243.      public void shellInsertionSort(double [] sorted){   
  244.   
  245.          int[] incs={7,5,3,1};   
  246.   
  247.          int num= incs.length;   
  248.   
  249.           
  250.          int inc=0;   
  251.   
  252.          for(int j=0;j<num;j++){   
  253.   
  254.               inc= incs[j];            
  255.   
  256.               shellInertionSort(sorted,inc);              
  257.   
  258.          }          
  259.   
  260.      }      
  261.   
  262.      public static void main(String[] args) {   
  263.   
  264.          Random random= new Random(6);   
  265.   
  266.            
  267.   
  268.          int arraysize= 21;   
  269.   
  270.          double [] sorted=new double[arraysize];   
  271.   
  272.          System.out.print("Before Sort:");           
  273.   
  274.          for(int j=1;j<arraysize;j++){   
  275.   
  276.               sorted[j]= (int)(random.nextDouble()* 100);   
  277.   
  278.               System.out.print((int)sorted[j]+" ");   
  279.   
  280.          }      
  281.   
  282.          System.out.println();   
  283.   
  284.                      
  285.   
  286.          InsertionSort sorter=new InsertionSort();       
  287.   
  288. //       sorter.straightInsertionSort(sorted);   
  289.   
  290.          sorter.shellInsertionSort(sorted);   
  291.   
  292.            
  293.   
  294.          System.out.print("After Sort:");   
  295.   
  296.          for(int j=1;j<sorted.length;j++){   
  297.   
  298.               System.out.print((int)sorted[j]+" ");   
  299.   
  300.          }      
  301.   
  302.          System.out.println();   
  303.   
  304.      }   
  305.   
  306. }  
  1. public class InsertionSort {     
  2.     
  3. //   插入排序:直接插入排序,希尔排序        
  4.     
  5.      public void straightInsertionSort(double [] sorted){     
  6.     
  7.          int sortedLen= sorted.length;     
  8.     
  9.          for(int j=2;j<sortedLen;j++){     
  10.     
  11.               if(sorted[j]<sorted[j-1]){     
  12.     
  13.                    sorted[0]= sorted[j];//先保存一下后面的那个                      
  14.     
  15.                    sorted[j]=sorted[j-1];// 前面的那个后移。     
  16.     
  17.                    int insertPos=0;     
  18.     
  19.                    for(int k=j-2;k>=0;k--){     
  20.     
  21.                        if(sorted[k]>sorted[0]){     
  22.     
  23.                             sorted[k+1]=sorted[k];     
  24.     
  25.                        }else{     
  26.     
  27.                             insertPos=k+1;     
  28.     
  29.                             break;     
  30.     
  31.                        }     
  32.     
  33.                    }                      
  34.     
  35.                    sorted[insertPos]=sorted[0];     
  36.     
  37.               }                 
  38.     
  39.          }            
  40.     
  41.      }        
  42.     
  43.      public void shellInertionSort(double [] sorted, int inc){     
  44.     
  45.          int sortedLen= sorted.length;     
  46.     
  47.          for(int j=inc+1;j<sortedLen;j++ ){     
  48.     
  49.               if(sorted[j]<sorted[j-inc]){     
  50.     
  51.                    sorted[0]= sorted[j];//先保存一下后面的那个     
  52.     
  53.                        
  54.     
  55.                    int insertPos=j;                    
  56.     
  57.                    for(int k=j-inc;k>=0;k-=inc){                         
  58.     
  59.                        if(sorted[k]>sorted[0]){     
  60.     
  61.                             sorted[k+inc]=sorted[k];                               
  62.     
  63.                             //数据结构课本上这个地方没有给出判读,出错:     
  64.     
  65.                             if(k-inc<=0){     
  66.     
  67.                                  insertPos = k;     
  68.     
  69.                             }     
  70.     
  71.                        }else{     
  72.     
  73.                             insertPos=k+inc;     
  74.     
  75.                             break;     
  76.     
  77.                        }     
  78.     
  79.                    }                      
  80.     
  81.                    sorted[insertPos]=sorted[0];                       
  82.     
  83.               }     
  84.     
  85.          }     
  86.     
  87.      }     
  88.     
  89.      public void shellInsertionSort(double [] sorted){     
  90.     
  91.          int[] incs={7,5,3,1};     
  92.     
  93.          int num= incs.length;     
  94.     
  95.              
  96.     
  97.          int inc=0;     
  98.     
  99.          for(int j=0;j<num;j++){     
  100.     
  101.               inc= incs[j];              
  102.     
  103.               shellInertionSort(sorted,inc);                
  104.     
  105.          }            
  106.     
  107.      }        
  108.     
  109.      public static void main(String[] args) {     
  110.     
  111.          Random random= new Random(6);     
  112.     
  113.              
  114.     
  115.          int arraysize= 21;     
  116.     
  117.          double [] sorted=new double[arraysize];     
  118.     
  119.          System.out.print("Before Sort:");             
  120.     
  121.          for(int j=1;j<arraysize;j++){     
  122.     
  123.               sorted[j]= (int)(random.nextDouble()* 100);     
  124.     
  125.               System.out.print((int)sorted[j]+" ");     
  126.     
  127.          }        
  128.     
  129.          System.out.println();     
  130.     
  131.                        
  132.     
  133.          InsertionSort sorter=new InsertionSort();         
  134.     
  135. //       sorter.straightInsertionSort(sorted);     
  136.     
  137.          sorter.shellInsertionSort(sorted);     
  138.     
  139.              
  140.     
  141.          System.out.print("After Sort:");     
  142.     
  143.          for(int j=1;j<sorted.length;j++){     
  144.     
  145.               System.out.print((int)sorted[j]+" ");     
  146.     
  147.          }        
  148.     
  149.          System.out.println();     
  150.     
  151.      }     
  152.     
  153. }    
  154.   
  155. public class InsertionSort {  
  156.   
  157. //   插入排序:直接插入排序,希尔排序     
  158.   
  159.      public void straightInsertionSort(double [] sorted){  
  160.   
  161.          int sortedLen= sorted.length;  
  162.   
  163.          for(int j=2;j<sortedLen;j++){  
  164.   
  165.               if(sorted[j]<sorted[j-1]){  
  166.   
  167.                    sorted[0]= sorted[j];//先保存一下后面的那个                   
  168.   
  169.                    sorted[j]=sorted[j-1];// 前面的那个后移。  
  170.   
  171.                    int insertPos=0;  
  172.   
  173.                    for(int k=j-2;k>=0;k--){  
  174.   
  175.                        if(sorted[k]>sorted[0]){  
  176.   
  177.                             sorted[k+1]=sorted[k];  
  178.   
  179.                        }else{  
  180.   
  181.                             insertPos=k+1;  
  182.   
  183.                             break;  
  184.   
  185.                        }  
  186.   
  187.                    }                   
  188.   
  189.                    sorted[insertPos]=sorted[0];  
  190.   
  191.               }              
  192.   
  193.          }         
  194.   
  195.      }     
  196.   
  197.      public void shellInertionSort(double [] sorted, int inc){  
  198.   
  199.          int sortedLen= sorted.length;  
  200.   
  201.          for(int j=inc+1;j<sortedLen;j++ ){  
  202.   
  203.               if(sorted[j]<sorted[j-inc]){  
  204.   
  205.                    sorted[0]= sorted[j];//先保存一下后面的那个  
  206.   
  207.                     
  208.   
  209.                    int insertPos=j;                 
  210.   
  211.                    for(int k=j-inc;k>=0;k-=inc){                      
  212.   
  213.                        if(sorted[k]>sorted[0]){  
  214.   
  215.                             sorted[k+inc]=sorted[k];                            
  216.   
  217.                             //数据结构课本上这个地方没有给出判读,出错:  
  218.   
  219.                             if(k-inc<=0){  
  220.   
  221.                                  insertPos = k;  
  222.   
  223.                             }  
  224.   
  225.                        }else{  
  226.   
  227.                             insertPos=k+inc;  
  228.   
  229.                             break;  
  230.   
  231.                        }  
  232.   
  233.                    }                   
  234.   
  235.                    sorted[insertPos]=sorted[0];                    
  236.   
  237.               }  
  238.   
  239.          }  
  240.   
  241.      }  
  242.   
  243.      public void shellInsertionSort(double [] sorted){  
  244.   
  245.          int[] incs={7,5,3,1};  
  246.   
  247.          int num= incs.length;  
  248.   
  249.          
  250.          int inc=0;  
  251.   
  252.          for(int j=0;j<num;j++){  
  253.   
  254.               inc= incs[j];           
  255.   
  256.               shellInertionSort(sorted,inc);             
  257.   
  258.          }         
  259.   
  260.      }     
  261.   
  262.      public static void main(String[] args) {  
  263.   
  264.          Random random= new Random(6);  
  265.   
  266.           
  267.   
  268.          int arraysize= 21;  
  269.   
  270.          double [] sorted=new double[arraysize];  
  271.   
  272.          System.out.print("Before Sort:");          
  273.   
  274.          for(int j=1;j<arraysize;j++){  
  275.   
  276.               sorted[j]= (int)(random.nextDouble()* 100);  
  277.   
  278.               System.out.print((int)sorted[j]+" ");  
  279.   
  280.          }     
  281.   
  282.          System.out.println();  
  283.   
  284.                     
  285.   
  286.          InsertionSort sorter=new InsertionSort();      
  287.   
  288. //       sorter.straightInsertionSort(sorted);  
  289.   
  290.          sorter.shellInsertionSort(sorted);  
  291.   
  292.           
  293.   
  294.          System.out.print("After Sort:");  
  295.   
  296.          for(int j=1;j<sorted.length;j++){  
  297.   
  298.               System.out.print((int)sorted[j]+" ");  
  299.   
  300.          }     
  301.   
  302.          System.out.println();  
  303.   
  304.      }  
  305.   
  306. }  



5)交换排序:

包括冒泡排序,快速排序。

冒泡排序法:该算法是专门针对已部分排序的数据进行排序的一种排序算法。如果在你的数据清单中只有一两个数据是乱序的话,用这种算法就是最快的排序算法。如果你的数据清单中的数据是随机排列的,那么这种方法就成了最慢的算法了。因此在使用这种算法之前一定要慎重。这种算法的核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。

快速排序:通过一趟排序,将待排序记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。具体做法是:使用两个指针low,high, 初值分别设置为序列的头,和序列的尾,设置pivotkey为第一个记录,首先从high开始向前搜索第一个小于pivotkey的记录和pivotkey所在位置进行交换,然后从low开始向后搜索第一个大于pivotkey的记录和此时pivotkey所在位置进行交换,重复知道low=high了为止。

交换排序Java代码:

Java代码
Java代码 复制代码
  1. public class ExchangeSort {      
  2.      
  3.      public void BubbleExchangeSort(double [] sorted){      
  4.      
  5.          int sortedLen= sorted.length;      
  6.      
  7.          for(int j=sortedLen;j>0;j--){      
  8.      
  9.               int end= j;      
  10.      
  11.               for(int k=1;k<end-1;k++){      
  12.      
  13.                    double tempB= sorted[k];      
  14.      
  15.                    sorted[k]= sorted[k]<sorted[k+1]?      
  16.      
  17. sorted[k]:sorted[k+1];      
  18.      
  19.                    if(Math.abs(sorted[k]-tempB)>10e-6){      
  20.      
  21.                        sorted[k+1]=tempB;      
  22.      
  23.                    }      
  24.      
  25.               }                  
  26.      
  27.          }      
  28.      
  29.      }         
  30.      
  31.      public void QuickExchangeSortBackTrack(double [] sorted,      
  32.      
  33. int low,int high){      
  34.      
  35.          if(low<high){      
  36.      
  37.               int pivot= findPivot(sorted,low,high);      
  38.      
  39.               QuickExchangeSortBackTrack(sorted,low,pivot-1);      
  40.      
  41.               QuickExchangeSortBackTrack(sorted,pivot+1,high);      
  42.      
  43.          }      
  44.      
  45.      }      
  46.      
  47.      public int findPivot(double [] sorted, int low, int high){              
  48.      
  49.          sorted[0]= sorted[low];          
  50.      
  51.          while(low<high){      
  52.      
  53.               while(low<high && sorted[high]>= sorted[0])--high;      
  54.      
  55.               sorted[low]= sorted[high];      
  56.      
  57.               while(low<high && sorted[low]<=sorted[0])++low;      
  58.      
  59.               sorted[high]= sorted[low];      
  60.      
  61.          }      
  62.      
  63.          sorted[low]=sorted[0];      
  64.      
  65.          return low;      
  66.      
  67.      }      
  68.      
  69.      public static void main(String[] args) {      
  70.      
  71.          Random random= new Random(6);      
  72.      
  73.               
  74.      
  75.          int arraysize= 21;      
  76.      
  77.          double [] sorted=new double[arraysize];      
  78.      
  79.          System.out.print("Before Sort:");              
  80.      
  81.          for(int j=1;j<arraysize;j++){      
  82.      
  83.               sorted[j]= (int)(random.nextDouble()* 100);      
  84.      
  85.               System.out.print((int)sorted[j]+" ");      
  86.      
  87.          }         
  88.      
  89.          System.out.println();      
  90.      
  91.                         
  92.      
  93.          ExchangeSort sorter=new ExchangeSort();            
  94.      
  95. //       sorter.BubbleExchangeSort(sorted);      
  96.      
  97.          sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1);      
  98.      
  99.          System.out.print("After Sort:");      
  100.      
  101.          for(int j=1;j<sorted.length;j++){      
  102.      
  103.               System.out.print((int)sorted[j]+" ");      
  104.      
  105.          }         
  106.      
  107.          System.out.println();      
  108.      
  109.      }      
  110.      
  111. }     
  112.   
  113. public class ExchangeSort {   
  114.   
  115.      public void BubbleExchangeSort(double [] sorted){   
  116.   
  117.          int sortedLen= sorted.length;   
  118.   
  119.          for(int j=sortedLen;j>0;j--){   
  120.   
  121.               int end= j;   
  122.   
  123.               for(int k=1;k<end-1;k++){   
  124.   
  125.                    double tempB= sorted[k];   
  126.   
  127.                    sorted[k]= sorted[k]<sorted[k+1]?   
  128.   
  129. sorted[k]:sorted[k+1];   
  130.   
  131.                    if(Math.abs(sorted[k]-tempB)>10e-6){   
  132.   
  133.                        sorted[k+1]=tempB;   
  134.   
  135.                    }   
  136.   
  137.               }               
  138.   
  139.          }   
  140.   
  141.      }      
  142.   
  143.      public void QuickExchangeSortBackTrack(double [] sorted,   
  144.   
  145. int low,int high){   
  146.   
  147.          if(low<high){   
  148.   
  149.               int pivot= findPivot(sorted,low,high);   
  150.   
  151.               QuickExchangeSortBackTrack(sorted,low,pivot-1);   
  152.   
  153.               QuickExchangeSortBackTrack(sorted,pivot+1,high);   
  154.   
  155.          }   
  156.   
  157.      }   
  158.   
  159.      public int findPivot(double [] sorted, int low, int high){           
  160.   
  161.          sorted[0]= sorted[low];       
  162.   
  163.          while(low<high){   
  164.   
  165.               while(low<high && sorted[high]>= sorted[0])--high;   
  166.   
  167.               sorted[low]= sorted[high];   
  168.   
  169.               while(low<high && sorted[low]<=sorted[0])++low;   
  170.   
  171.               sorted[high]= sorted[low];   
  172.   
  173.          }   
  174.   
  175.          sorted[low]=sorted[0];   
  176.   
  177.          return low;   
  178.   
  179.      }   
  180.   
  181.      public static void main(String[] args) {   
  182.   
  183.          Random random= new Random(6);   
  184.   
  185.            
  186.   
  187.          int arraysize= 21;   
  188.   
  189.          double [] sorted=new double[arraysize];   
  190.   
  191.          System.out.print("Before Sort:");           
  192.   
  193.          for(int j=1;j<arraysize;j++){   
  194.   
  195.               sorted[j]= (int)(random.nextDouble()* 100);   
  196.   
  197.               System.out.print((int)sorted[j]+" ");   
  198.   
  199.          }      
  200.   
  201.          System.out.println();   
  202.   
  203.                      
  204.   
  205.          ExchangeSort sorter=new ExchangeSort();         
  206.   
  207. //       sorter.BubbleExchangeSort(sorted);   
  208.   
  209.          sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1);   
  210.   
  211.          System.out.print("After Sort:");   
  212.   
  213.          for(int j=1;j<sorted.length;j++){   
  214.   
  215.               System.out.print((int)sorted[j]+" ");   
  216.   
  217.          }      
  218.   
  219.          System.out.println();   
  220.   
  221.      }   
  222.   
  223. }  
  1. public class ExchangeSort {     
  2.     
  3.      public void BubbleExchangeSort(double [] sorted){     
  4.     
  5.          int sortedLen= sorted.length;     
  6.     
  7.          for(int j=sortedLen;j>0;j--){     
  8.     
  9.               int end= j;     
  10.     
  11.               for(int k=1;k<end-1;k++){     
  12.     
  13.                    double tempB= sorted[k];     
  14.     
  15.                    sorted[k]= sorted[k]<sorted[k+1]?     
  16.     
  17. sorted[k]:sorted[k+1];     
  18.     
  19.                    if(Math.abs(sorted[k]-tempB)>10e-6){     
  20.     
  21.                        sorted[k+1]=tempB;     
  22.     
  23.                    }     
  24.     
  25.               }                 
  26.     
  27.          }     
  28.     
  29.      }        
  30.     
  31.      public void QuickExchangeSortBackTrack(double [] sorted,     
  32.     
  33. int low,int high){     
  34.     
  35.          if(low<high){     
  36.     
  37.               int pivot= findPivot(sorted,low,high);     
  38.     
  39.               QuickExchangeSortBackTrack(sorted,low,pivot-1);     
  40.     
  41.               QuickExchangeSortBackTrack(sorted,pivot+1,high);     
  42.     
  43.          }     
  44.     
  45.      }     
  46.     
  47.      public int findPivot(double [] sorted, int low, int high){             
  48.     
  49.          sorted[0]= sorted[low];         
  50.     
  51.          while(low<high){     
  52.     
  53.               while(low<high && sorted[high]>= sorted[0])--high;     
  54.     
  55.               sorted[low]= sorted[high];     
  56.     
  57.               while(low<high && sorted[low]<=sorted[0])++low;     
  58.     
  59.               sorted[high]= sorted[low];     
  60.     
  61.          }     
  62.     
  63.          sorted[low]=sorted[0];     
  64.     
  65.          return low;     
  66.     
  67.      }     
  68.     
  69.      public static void main(String[] args) {     
  70.     
  71.          Random random= new Random(6);     
  72.     
  73.              
  74.     
  75.          int arraysize= 21;     
  76.     
  77.          double [] sorted=new double[arraysize];     
  78.     
  79.          System.out.print("Before Sort:");             
  80.     
  81.          for(int j=1;j<arraysize;j++){     
  82.     
  83.               sorted[j]= (int)(random.nextDouble()* 100);     
  84.     
  85.               System.out.print((int)sorted[j]+" ");     
  86.     
  87.          }        
  88.     
  89.          System.out.println();     
  90.     
  91.                        
  92.     
  93.          ExchangeSort sorter=new ExchangeSort();           
  94.     
  95. //       sorter.BubbleExchangeSort(sorted);     
  96.     
  97.          sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1);     
  98.     
  99.          System.out.print("After Sort:");     
  100.     
  101.          for(int j=1;j<sorted.length;j++){     
  102.     
  103.               System.out.print((int)sorted[j]+" ");     
  104.     
  105.          }        
  106.     
  107.          System.out.println();     
  108.     
  109.      }     
  110.     
  111. }    
  112.   
  113. public class ExchangeSort {  
  114.   
  115.      public void BubbleExchangeSort(double [] sorted){  
  116.   
  117.          int sortedLen= sorted.length;  
  118.   
  119.          for(int j=sortedLen;j>0;j--){  
  120.   
  121.               int end= j;  
  122.   
  123.               for(int k=1;k<end-1;k++){  
  124.   
  125.                    double tempB= sorted[k];  
  126.   
  127.                    sorted[k]= sorted[k]<sorted[k+1]?  
  128.   
  129. sorted[k]:sorted[k+1];  
  130.   
  131.                    if(Math.abs(sorted[k]-tempB)>10e-6){  
  132.   
  133.                        sorted[k+1]=tempB;  
  134.   
  135.                    }  
  136.   
  137.               }              
  138.   
  139.          }  
  140.   
  141.      }     
  142.   
  143.      public void QuickExchangeSortBackTrack(double [] sorted,  
  144.   
  145. int low,int high){  
  146.   
  147.          if(low<high){  
  148.   
  149.               int pivot= findPivot(sorted,low,high);  
  150.   
  151.               QuickExchangeSortBackTrack(sorted,low,pivot-1);  
  152.   
  153.               QuickExchangeSortBackTrack(sorted,pivot+1,high);  
  154.   
  155.          }  
  156.   
  157.      }  
  158.   
  159.      public int findPivot(double [] sorted, int low, int high){          
  160.   
  161.          sorted[0]= sorted[low];      
  162.   
  163.          while(low<high){  
  164.   
  165.               while(low<high && sorted[high]>= sorted[0])--high;  
  166.   
  167.               sorted[low]= sorted[high];  
  168.   
  169.               while(low<high && sorted[low]<=sorted[0])++low;  
  170.   
  171.               sorted[high]= sorted[low];  
  172.   
  173.          }  
  174.   
  175.          sorted[low]=sorted[0];  
  176.   
  177.          return low;  
  178.   
  179.      }  
  180.   
  181.      public static void main(String[] args) {  
  182.   
  183.          Random random= new Random(6);  
  184.   
  185.           
  186.   
  187.          int arraysize= 21;  
  188.   
  189.          double [] sorted=new double[arraysize];  
  190.   
  191.          System.out.print("Before Sort:");          
  192.   
  193.          for(int j=1;j<arraysize;j++){  
  194.   
  195.               sorted[j]= (int)(random.nextDouble()* 100);  
  196.   
  197.               System.out.print((int)sorted[j]+" ");  
  198.   
  199.          }     
  200.   
  201.          System.out.println();  
  202.   
  203.                     
  204.   
  205.          ExchangeSort sorter=new ExchangeSort();        
  206.   
  207. //       sorter.BubbleExchangeSort(sorted);  
  208.   
  209.          sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1);  
  210.   
  211.          System.out.print("After Sort:");  
  212.   
  213.          for(int j=1;j<sorted.length;j++){  
  214.   
  215.               System.out.print((int)sorted[j]+" ");  
  216.   
  217.          }     
  218.   
  219.          System.out.println();  
  220.   
  221.      }  
  222.   
  223. }  

6)选择排序:

分为直接选择排序,堆排序

直接选择排序:第i次选取 i到array.Length-1中间最小的值放在i位置。

堆排序:首先,数组里面用层次遍历的顺序放一棵完全二叉树。从最后一个非终端结点往前面调整,直到到达根结点,这个时候除根节点以外的所有非终端节点都已经满足堆得条件了,于是需要调整根节点使得整个树满足堆得条件,于是从根节点开始,沿着它的儿子们往下面走(最大堆沿着最大的儿子走,最小堆沿着最小的儿子走)。主程序里面,首先从最后一个非终端节点开始调整到根也调整完,形成一个heap, 然后将heap的根放到后面去(即:每次的树大小会变化,但是 root都是在1的位置,以方便计算儿子们的index,所以如果需要升序排列,则要逐步大顶堆。因为根节点被一个个放在后面去了。降序排列则要建立小顶堆)

代码中的问题:有时候第2个和第3个顺序不对(原因还没搞明白到底代码哪里有错)

选择排序Java代码:

Java代码
Java代码 复制代码
  1. public class SelectionSort {      
  2.      
  3.      public void straitSelectionSort(double [] sorted){      
  4.      
  5.          int sortedLen= sorted.length;      
  6.      
  7.          for(int j=1;j<sortedLen;j++){      
  8.      
  9.               int jMin= getMinIndex(sorted,j);      
  10.      
  11.               exchange(sorted,j,jMin);      
  12.      
  13.          }      
  14.      
  15.      }      
  16.      
  17.      public void exchange(double [] sorted,int i,int j){      
  18.      
  19.          int sortedLen= sorted.length;      
  20.      
  21.          if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){      
  22.      
  23.               double temp= sorted[i];      
  24.      
  25.               sorted[i]=sorted[j];      
  26.      
  27.               sorted[j]=temp;      
  28.      
  29.          }      
  30.      
  31.      }      
  32.      
  33.      public int getMinIndex(double [] sorted, int i){      
  34.      
  35.          int sortedLen= sorted.length;      
  36.      
  37.               
  38.      
  39.          int minJ=1;      
  40.      
  41.          double min= Double.MAX_VALUE;      
  42.      
  43.          for(int j=i;j<sortedLen;j++){      
  44.      
  45.               if(sorted[j]<min){      
  46.      
  47.                    min= sorted[j];      
  48.      
  49.                    minJ= j;      
  50.      
  51.               }      
  52.      
  53.          }      
  54.      
  55.          return minJ;      
  56.      
  57.      }      
  58.      
  59.               
  60.      
  61.      public void heapAdjust(double [] sorted,int start,int end){      
  62.      
  63.          if(start<end){      
  64.      
  65.               double temp= sorted[start];      
  66.      
  67. //            这个地方j<end与课本不同,j<=end会报错:      
  68.      
  69.               for(int j=2*start;j<end;j *=2){      
  70.      
  71.                    if(j+1<end && sorted[j]-sorted[j+1]>10e-6){      
  72.      
  73.                        ++j;               
  74.      
  75.                    }      
  76.      
  77.                    if(temp<=sorted[j]){      
  78.      
  79.                        break;      
  80.      
  81.                    }                  
  82.      
  83.                    sorted[start]=sorted[j];      
  84.      
  85.                    start=j;                
  86.      
  87.               }      
  88.      
  89.               sorted[start]=temp;      
  90.      
  91.          }      
  92.      
  93.      }         
  94.      
  95.      public void heapSelectionSort(double [] sorted){      
  96.      
  97.          int sortedLen = sorted.length;      
  98.      
  99.               
  100.      
  101.          for(int i=sortedLen/2;i>0;i--){      
  102.      
  103.               heapAdjust(sorted,i,sortedLen);      
  104.      
  105.          }      
  106.      
  107.          for(int i=sortedLen;i>1;--i){                 
  108.      
  109.               exchange(sorted,1,i);                 
  110.      
  111.               heapAdjust(sorted,1,i-1);                 
  112.      
  113.          }             
  114.      
  115.      }      
  116.      
  117.      public static void main(String [] args){      
  118.      
  119.          Random random= new Random(6);      
  120.      
  121.               
  122.      
  123.          int arraysize=9;      
  124.      
  125.          double [] sorted=new double[arraysize];      
  126.      
  127.          System.out.print("Before Sort:");              
  128.      
  129.          for(int j=1;j<arraysize;j++){      
  130.      
  131.               sorted[j]= (int)(random.nextDouble()* 100);      
  132.      
  133.               System.out.print((int)sorted[j]+" ");      
  134.      
  135.          }         
  136.      
  137.          System.out.println();      
  138.      
  139.                         
  140.      
  141.          SelectionSort sorter=new SelectionSort();          
  142.      
  143. //       sorter.straitSelectionSort(sorted);      
  144.      
  145.          sorter.heapSelectionSort(sorted);      
  146.      
  147.               
  148.      
  149.          System.out.print("After Sort:");      
  150.      
  151.          for(int j=1;j<sorted.length;j++){      
  152.      
  153.               System.out.print((int)sorted[j]+" ");      
  154.      
  155.          }         
  156.      
  157.          System.out.println();      
  158.      
  159.      }      
  160.      
  161. }     
  162.   
  163. public class SelectionSort {   
  164.   
  165.      public void straitSelectionSort(double [] sorted){   
  166.   
  167.          int sortedLen= sorted.length;   
  168.   
  169.          for(int j=1;j<sortedLen;j++){   
  170.   
  171.               int jMin= getMinIndex(sorted,j);   
  172.   
  173.               exchange(sorted,j,jMin);   
  174.   
  175.          }   
  176.   
  177.      }   
  178.   
  179.      public void exchange(double [] sorted,int i,int j){   
  180.   
  181.          int sortedLen= sorted.length;   
  182.   
  183.          if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){   
  184.   
  185.               double temp= sorted[i];   
  186.   
  187.               sorted[i]=sorted[j];   
  188.   
  189.               sorted[j]=temp;   
  190.   
  191.          }   
  192.   
  193.      }   
  194.   
  195.      public int getMinIndex(double [] sorted, int i){   
  196.   
  197.          int sortedLen= sorted.length;   
  198.   
  199.            
  200.   
  201.          int minJ=1;   
  202.   
  203.          double min= Double.MAX_VALUE;   
  204.   
  205.          for(int j=i;j<sortedLen;j++){   
  206.   
  207.               if(sorted[j]<min){   
  208.   
  209.                    min= sorted[j];   
  210.   
  211.                    minJ= j;   
  212.   
  213.               }   
  214.   
  215.          }   
  216.   
  217.          return minJ;   
  218.   
  219.      }   
  220.   
  221.            
  222.   
  223.      public void heapAdjust(double [] sorted,int start,int end){   
  224.   
  225.          if(start<end){   
  226.   
  227.               double temp= sorted[start];   
  228.   
  229. //            这个地方j<end与课本不同,j<=end会报错:   
  230.   
  231.               for(int j=2*start;j<end;j *=2){   
  232.   
  233.                    if(j+1<end && sorted[j]-sorted[j+1]>10e-6){   
  234.   
  235.                        ++j;            
  236.   
  237.                    }   
  238.   
  239.                    if(temp<=sorted[j]){   
  240.   
  241.                        break;   
  242.   
  243.                    }               
  244.   
  245.                    sorted[start]=sorted[j];   
  246.   
  247.                    start=j;             
  248.   
  249.               }   
  250.   
  251.               sorted[start]=temp;   
  252.   
  253.          }   
  254.   
  255.      }      
  256.   
  257.      public void heapSelectionSort(double [] sorted){   
  258.   
  259.          int sortedLen = sorted.length;   
  260.   
  261.            
  262.   
  263.          for(int i=sortedLen/2;i>0;i--){   
  264.   
  265.               heapAdjust(sorted,i,sortedLen);   
  266.   
  267.          }   
  268.   
  269.          for(int i=sortedLen;i>1;--i){              
  270.   
  271.               exchange(sorted,1,i);              
  272.   
  273.               heapAdjust(sorted,1,i-1);              
  274.   
  275.          }          
  276.   
  277.      }   
  278.   
  279.      public static void main(String [] args){   
  280.   
  281.          Random random= new Random(6);   
  282.   
  283.            
  284.   
  285.          int arraysize=9;   
  286.   
  287.          double [] sorted=new double[arraysize];   
  288.   
  289.          System.out.print("Before Sort:");           
  290.   
  291.          for(int j=1;j<arraysize;j++){   
  292.   
  293.               sorted[j]= (int)(random.nextDouble()* 100);   
  294.   
  295.               System.out.print((int)sorted[j]+" ");   
  296.   
  297.          }      
  298.   
  299.          System.out.println();   
  300.   
  301.                      
  302.   
  303.          SelectionSort sorter=new SelectionSort();       
  304.   
  305. //       sorter.straitSelectionSort(sorted);   
  306.   
  307.          sorter.heapSelectionSort(sorted);   
  308.   
  309.            
  310.   
  311.          System.out.print("After Sort:");   
  312.   
  313.          for(int j=1;j<sorted.length;j++){   
  314.   
  315.               System.out.print((int)sorted[j]+" ");   
  316.   
  317.          }      
  318.   
  319.          System.out.println();   
  320.   
  321.      }   
  322.   
  323. }  
  1. public class SelectionSort {     
  2.     
  3.      public void straitSelectionSort(double [] sorted){     
  4.     
  5.          int sortedLen= sorted.length;     
  6.     
  7.          for(int j=1;j<sortedLen;j++){     
  8.     
  9.               int jMin= getMinIndex(sorted,j);     
  10.     
  11.               exchange(sorted,j,jMin);     
  12.     
  13.          }     
  14.     
  15.      }     
  16.     
  17.      public void exchange(double [] sorted,int i,int j){     
  18.     
  19.          int sortedLen= sorted.length;     
  20.     
  21.          if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){     
  22.     
  23.               double temp= sorted[i];     
  24.     
  25.               sorted[i]=sorted[j];     
  26.     
  27.               sorted[j]=temp;     
  28.     
  29.          }     
  30.     
  31.      }     
  32.     
  33.      public int getMinIndex(double [] sorted, int i){     
  34.     
  35.          int sortedLen= sorted.length;     
  36.     
  37.              
  38.     
  39.          int minJ=1;     
  40.     
  41.          double min= Double.MAX_VALUE;     
  42.     
  43.          for(int j=i;j<sortedLen;j++){     
  44.     
  45.               if(sorted[j]<min){     
  46.     
  47.                    min= sorted[j];     
  48.     
  49.                    minJ= j;     
  50.     
  51.               }     
  52.     
  53.          }     
  54.     
  55.          return minJ;     
  56.     
  57.      }     
  58.     
  59.              
  60.     
  61.      public void heapAdjust(double [] sorted,int start,int end){     
  62.     
  63.          if(start<end){     
  64.     
  65.               double temp= sorted[start];     
  66.     
  67. //            这个地方j<end与课本不同,j<=end会报错:     
  68.     
  69.               for(int j=2*start;j<end;j *=2){     
  70.     
  71.                    if(j+1<end && sorted[j]-sorted[j+1]>10e-6){     
  72.     
  73.                        ++j;              
  74.     
  75.                    }     
  76.     
  77.                    if(temp<=sorted[j]){     
  78.     
  79.                        break;     
  80.     
  81.                    }                 
  82.     
  83.                    sorted[start]=sorted[j];     
  84.     
  85.                    start=j;               
  86.     
  87.               }     
  88.     
  89.               sorted[start]=temp;     
  90.     
  91.          }     
  92.     
  93.      }        
  94.     
  95.      public void heapSelectionSort(double [] sorted){     
  96.     
  97.          int sortedLen = sorted.length;     
  98.     
  99.              
  100.     
  101.          for(int i=sortedLen/2;i>0;i--){     
  102.     
  103.               heapAdjust(sorted,i,sortedLen);     
  104.     
  105.          }     
  106.     
  107.          for(int i=sortedLen;i>1;--i){                
  108.     
  109.               exchange(sorted,1,i);                
  110.     
  111.               heapAdjust(sorted,1,i-1);                
  112.     
  113.          }            
  114.     
  115.      }     
  116.     
  117.      public static void main(String [] args){     
  118.     
  119.          Random random= new Random(6);     
  120.     
  121.              
  122.     
  123.          int arraysize=9;     
  124.     
  125.          double [] sorted=new double[arraysize];     
  126.     
  127.          System.out.print("Before Sort:");             
  128.     
  129.          for(int j=1;j<arraysize;j++){     
  130.     
  131.               sorted[j]= (int)(random.nextDouble()* 100);     
  132.     
  133.               System.out.print((int)sorted[j]+" ");     
  134.     
  135.          }        
  136.     
  137.          System.out.println();     
  138.     
  139.                        
  140.     
  141.          SelectionSort sorter=new SelectionSort();         
  142.     
  143. //       sorter.straitSelectionSort(sorted);     
  144.     
  145.          sorter.heapSelectionSort(sorted);     
  146.     
  147.              
  148.     
  149.          System.out.print("After Sort:");     
  150.     
  151.          for(int j=1;j<sorted.length;j++){     
  152.     
  153.               System.out.print((int)sorted[j]+" ");     
  154.     
  155.          }        
  156.     
  157.          System.out.println();     
  158.     
  159.      }     
  160.     
  161. }    
  162.   
  163. public class SelectionSort {  
  164.   
  165.      public void straitSelectionSort(double [] sorted){  
  166.   
  167.          int sortedLen= sorted.length;  
  168.   
  169.          for(int j=1;j<sortedLen;j++){  
  170.   
  171.               int jMin= getMinIndex(sorted,j);  
  172.   
  173.               exchange(sorted,j,jMin);  
  174.   
  175.          }  
  176.   
  177.      }  
  178.   
  179.      public void exchange(double [] sorted,int i,int j){  
  180.   
  181.          int sortedLen= sorted.length;  
  182.   
  183.          if(i<sortedLen && j<sortedLen && i<j && i>=0 && j>=0){  
  184.   
  185.               double temp= sorted[i];  
  186.   
  187.               sorted[i]=sorted[j];  
  188.   
  189.               sorted[j]=temp;  
  190.   
  191.          }  
  192.   
  193.      }  
  194.   
  195.      public int getMinIndex(double [] sorted, int i){  
  196.   
  197.          int sortedLen= sorted.length;  
  198.   
  199.           
  200.   
  201.          int minJ=1;  
  202.   
  203.          double min= Double.MAX_VALUE;  
  204.   
  205.          for(int j=i;j<sortedLen;j++){  
  206.   
  207.               if(sorted[j]<min){  
  208.   
  209.                    min= sorted[j];  
  210.   
  211.                    minJ= j;  
  212.   
  213.               }  
  214.   
  215.          }  
  216.   
  217.          return minJ;  
  218.   
  219.      }  
  220.   
  221.           
  222.   
  223.      public void heapAdjust(double [] sorted,int start,int end){  
  224.   
  225.          if(start<end){  
  226.   
  227.               double temp= sorted[start];  
  228.   
  229. //            这个地方j<end与课本不同,j<=end会报错:  
  230.   
  231.               for(int j=2*start;j<end;j *=2){  
  232.   
  233.                    if(j+1<end && sorted[j]-sorted[j+1]>10e-6){  
  234.   
  235.                        ++j;           
  236.   
  237.                    }  
  238.   
  239.                    if(temp<=sorted[j]){  
  240.   
  241.                        break;  
  242.   
  243.                    }              
  244.   
  245.                    sorted[start]=sorted[j];  
  246.   
  247.                    start=j;            
  248.   
  249.               }  
  250.   
  251.               sorted[start]=temp;  
  252.   
  253.          }  
  254.   
  255.      }     
  256.   
  257.      public void heapSelectionSort(double [] sorted){  
  258.   
  259.          int sortedLen = sorted.length;  
  260.   
  261.           
  262.   
  263.          for(int i=sortedLen/2;i>0;i--){  
  264.   
  265.               heapAdjust(sorted,i,sortedLen);  
  266.   
  267.          }  
  268.   
  269.          for(int i=sortedLen;i>1;--i){             
  270.   
  271.               exchange(sorted,1,i);             
  272.   
  273.               heapAdjust(sorted,1,i-1);             
  274.   
  275.          }         
  276.   
  277.      }  
  278.   
  279.      public static void main(String [] args){  
  280.   
  281.          Random random= new Random(6);  
  282.   
  283.           
  284.   
  285.          int arraysize=9;  
  286.   
  287.          double [] sorted=new double[arraysize];  
  288.   
  289.          System.out.print("Before Sort:");          
  290.   
  291.          for(int j=1;j<arraysize;j++){  
  292.   
  293.               sorted[j]= (int)(random.nextDouble()* 100);  
  294.   
  295.               System.out.print((int)sorted[j]+" ");  
  296.   
  297.          }     
  298.   
  299.          System.out.println();  
  300.   
  301.                     
  302.   
  303.          SelectionSort sorter=new SelectionSort();      
  304.   
  305. //       sorter.straitSelectionSort(sorted);  
  306.   
  307.          sorter.heapSelectionSort(sorted);  
  308.   
  309.           
  310.   
  311.          System.out.print("After Sort:");  
  312.   
  313.          for(int j=1;j<sorted.length;j++){  
  314.   
  315.               System.out.print((int)sorted[j]+" ");  
  316.   
  317.          }     
  318.   
  319.          System.out.println();  
  320.   
  321.      }  
  322.   
  323. }  

7)归并排序:

将两个或两个以上的有序表组合成一个新的有序表。归并排序要使用一个辅助数组,大小跟原数组相同,递归做法。每次将目标序列分解成两个序列,分别排序两个子序列之后,再将两个排序好的子序列merge到一起。

归并排序Java代码:

Java代码
Java代码 复制代码
  1.     
  2. public class MergeSort {       
  3.      
  4.      private double[] bridge;//辅助数组      
  5.      
  6.      public void sort(double[] obj){      
  7.      
  8.          if (obj == null){      
  9.      
  10.               throw new NullPointerException("      
  11.      
  12. The param can not be null!");      
  13.      
  14.          }      
  15.      
  16.          bridge = new double[obj.length]; // 初始化中间数组      
  17.      
  18.          mergeSort(obj, 0, obj.length - 1); // 归并排序      
  19.      
  20.          bridge = null;      
  21.      
  22.      }      
  23.      
  24.      private void mergeSort(double[] obj, int left, int right){      
  25.      
  26.          if (left < right){      
  27.      
  28.               int center = (left + right) / 2;      
  29.      
  30.               mergeSort(obj, left, center);      
  31.      
  32.               mergeSort(obj, center + 1, right);      
  33.      
  34.               merge(obj, left, center, right);      
  35.      
  36.          }      
  37.      
  38.      }      
  39.      
  40.      private void merge(double[] obj, int left,      
  41.      
  42. int center, int right){      
  43.      
  44.          int mid = center + 1;      
  45.      
  46.          int third = left;      
  47.      
  48.          int tmp = left;      
  49.      
  50.          while (left <= center && mid <= right){      
  51.      
  52. // 从两个数组中取出小的放入中间数组      
  53.      
  54.               if (obj[left]-obj[mid]<=10e-6){      
  55.      
  56.                    bridge[third++] = obj[left++];      
  57.      
  58.               } else{      
  59.      
  60.                    bridge[third++] = obj[mid++];      
  61.      
  62.               }      
  63.      
  64.          }      
  65.      
  66.        
  67.      
  68.          // 剩余部分依次置入中间数组      
  69.      
  70.          while (mid <= right){      
  71.      
  72.               bridge[third++] = obj[mid++];      
  73.      
  74.          }      
  75.      
  76.          while (left <= center){      
  77.      
  78.               bridge[third++] = obj[left++];      
  79.      
  80.          }      
  81.      
  82.          // 将中间数组的内容拷贝回原数组      
  83.      
  84.          copy(obj, tmp, right);      
  85.      
  86.      }      
  87.      
  88.      private void copy(double[] obj, int left, int right)      
  89.      
  90.      {      
  91.      
  92.          while (left <= right){      
  93.      
  94.               obj[left] = bridge[left];      
  95.      
  96.               left++;      
  97.      
  98.          }      
  99.      
  100.      }      
  101.      
  102.      public static void main(String[] args) {      
  103.      
  104.          Random random = new Random(6);      
  105.      
  106.        
  107.      
  108.          int arraysize = 10;      
  109.      
  110.          double[] sorted = new double[arraysize];      
  111.      
  112.          System.out.print("Before Sort:");      
  113.      
  114.          for (int j = 0; j < arraysize; j++) {      
  115.      
  116.               sorted[j] = (int) (random.nextDouble() * 100);      
  117.      
  118.               System.out.print((int) sorted[j] + " ");      
  119.      
  120.          }      
  121.      
  122.          System.out.println();      
  123.      
  124.        
  125.      
  126.          MergeSort sorter = new MergeSort();      
  127.      
  128.          sorter.sort(sorted);      
  129.      
  130.               
  131.      
  132.          System.out.print("After Sort:");      
  133.      
  134.          for (int j = 0; j < sorted.length; j++) {      
  135.      
  136.               System.out.print((int) sorted[j] + " ");      
  137.      
  138.          }      
  139.      
  140.          System.out.println();      
  141.      
  142.      }      
  143.      
  144. }     
  145.   
  146. public class MergeSort {    
  147.   
  148.      private double[] bridge;//辅助数组   
  149.   
  150.      public void sort(double[] obj){   
  151.   
  152.          if (obj == null){   
  153.   
  154.               throw new NullPointerException("   
  155.   
  156. The param can not be null!");   
  157.   
  158.          }   
  159.   
  160.          bridge = new double[obj.length]; // 初始化中间数组   
  161.   
  162.          mergeSort(obj, 0, obj.length - 1); // 归并排序   
  163.   
  164.          bridge = null;   
  165.   
  166.      }   
  167.   
  168.      private void mergeSort(double[] obj, int left, int right){   
  169.   
  170.          if (left < right){   
  171.   
  172.               int center = (left + right) / 2;   
  173.   
  174.               mergeSort(obj, left, center);   
  175.   
  176.               mergeSort(obj, center + 1, right);   
  177.   
  178.               merge(obj, left, center, right);   
  179.   
  180.          }   
  181.   
  182.      }   
  183.   
  184.      private void merge(double[] obj, int left,   
  185.   
  186. int center, int right){   
  187.   
  188.          int mid = center + 1;   
  189.   
  190.          int third = left;   
  191.   
  192.          int tmp = left;   
  193.   
  194.          while (left <= center && mid <= right){   
  195.   
  196. // 从两个数组中取出小的放入中间数组   
  197.   
  198.               if (obj[left]-obj[mid]<=10e-6){   
  199.   
  200.                    bridge[third++] = obj[left++];   
  201.   
  202.               } else{   
  203.   
  204.                    bridge[third++] = obj[mid++];   
  205.   
  206.               }   
  207.   
  208.          }   
  209.   
  210.     
  211.   
  212.          // 剩余部分依次置入中间数组   
  213.   
  214.          while (mid <= right){   
  215.   
  216.               bridge[third++] = obj[mid++];   
  217.   
  218.          }   
  219.   
  220.          while (left <= center){   
  221.   
  222.               bridge[third++] = obj[left++];   
  223.   
  224.          }   
  225.   
  226.          // 将中间数组的内容拷贝回原数组   
  227.   
  228.          copy(obj, tmp, right);   
  229.   
  230.      }   
  231.   
  232.      private void copy(double[] obj, int left, int right)   
  233.   
  234.      {   
  235.   
  236.          while (left <= right){   
  237.   
  238.               obj[left] = bridge[left];   
  239.   
  240.               left++;   
  241.   
  242.          }   
  243.   
  244.      }   
  245.   
  246.      public static void main(String[] args) {   
  247.   
  248.          Random random = new Random(6);   
  249.   
  250.     
  251.   
  252.          int arraysize = 10;   
  253.   
  254.          double[] sorted = new double[arraysize];   
  255.   
  256.          System.out.print("Before Sort:");   
  257.   
  258.          for (int j = 0; j < arraysize; j++) {   
  259.   
  260.               sorted[j] = (int) (random.nextDouble() * 100);   
  261.   
  262.               System.out.print((int) sorted[j] + " ");   
  263.   
  264.          }   
  265.   
  266.          System.out.println();   
  267.   
  268.     
  269.   
  270.          MergeSort sorter = new MergeSort();   
  271.   
  272.          sorter.sort(sorted);   
  273.   
  274.            
  275.   
  276.          System.out.print("After Sort:");   
  277.   
  278.          for (int j = 0; j < sorted.length; j++) {   
  279.   
  280.               System.out.print((int) sorted[j] + " ");   
  281.   
  282.          }   
  283.   
  284.          System.out.println();   
  285.   
  286.      }   
  287.   
  288. }  
  1.    
  2. public class MergeSort {      
  3.     
  4.      private double[] bridge;//辅助数组     
  5.     
  6.      public void sort(double[] obj){     
  7.     
  8.          if (obj == null){     
  9.     
  10.               throw new NullPointerException("     
  11.     
  12. The param can not be null!");     
  13.     
  14.          }     
  15.     
  16.          bridge = new double[obj.length]; // 初始化中间数组     
  17.     
  18.          mergeSort(obj, 0, obj.length - 1); // 归并排序     
  19.     
  20.          bridge = null;     
  21.     
  22.      }     
  23.     
  24.      private void mergeSort(double[] obj, int left, int right){     
  25.     
  26.          if (left < right){     
  27.     
  28.               int center = (left + right) / 2;     
  29.     
  30.               mergeSort(obj, left, center);     
  31.     
  32.               mergeSort(obj, center + 1, right);     
  33.     
  34.               merge(obj, left, center, right);     
  35.     
  36.          }     
  37.     
  38.      }     
  39.     
  40.      private void merge(double[] obj, int left,     
  41.     
  42. int center, int right){     
  43.     
  44.          int mid = center + 1;     
  45.     
  46.          int third = left;     
  47.     
  48.          int tmp = left;     
  49.     
  50.          while (left <= center && mid <= right){     
  51.     
  52. // 从两个数组中取出小的放入中间数组     
  53.     
  54.               if (obj[left]-obj[mid]<=10e-6){     
  55.     
  56.                    bridge[third++] = obj[left++];     
  57.     
  58.               } else{     
  59.     
  60.                    bridge[third++] = obj[mid++];     
  61.     
  62.               }     
  63.     
  64.          }     
  65.     
  66.       
  67.     
  68.          // 剩余部分依次置入中间数组     
  69.     
  70.          while (mid <= right){     
  71.     
  72.               bridge[third++] = obj[mid++];     
  73.     
  74.          }     
  75.     
  76.          while (left <= center){     
  77.     
  78.               bridge[third++] = obj[left++];     
  79.     
  80.          }     
  81.     
  82.          // 将中间数组的内容拷贝回原数组     
  83.     
  84.          copy(obj, tmp, right);     
  85.     
  86.      }     
  87.     
  88.      private void copy(double[] obj, int left, int right)     
  89.     
  90.      {     
  91.     
  92.          while (left <= right){     
  93.     
  94.               obj[left] = bridge[left];     
  95.     
  96.               left++;     
  97.     
  98.          }     
  99.     
  100.      }     
  101.     
  102.      public static void main(String[] args) {     
  103.     
  104.          Random random = new Random(6);     
  105.     
  106.       
  107.     
  108.          int arraysize = 10;     
  109.     
  110.          double[] sorted = new double[arraysize];     
  111.     
  112.          System.out.print("Before Sort:");     
  113.     
  114.          for (int j = 0; j < arraysize; j++) {     
  115.     
  116.               sorted[j] = (int) (random.nextDouble() * 100);     
  117.     
  118.               System.out.print((int) sorted[j] + " ");     
  119.     
  120.          }     
  121.     
  122.          System.out.println();     
  123.     
  124.       
  125.     
  126.          MergeSort sorter = new MergeSort();     
  127.     
  128.          sorter.sort(sorted);     
  129.     
  130.              
  131.     
  132.          System.out.print("After Sort:");     
  133.     
  134.          for (int j = 0; j < sorted.length; j++) {     
  135.     
  136.               System.out.print((int) sorted[j] + " ");     
  137.     
  138.          }     
  139.     
  140.          System.out.println();     
  141.     
  142.      }     
  143.     
  144. }    
  145.   
  146. public class MergeSort {   
  147.   
  148.      private double[] bridge;//辅助数组  
  149.   
  150.      public void sort(double[] obj){  
  151.   
  152.          if (obj == null){  
  153.   
  154.               throw new NullPointerException("  
  155.   
  156. The param can not be null!");  
  157.   
  158.          }  
  159.   
  160.          bridge = new double[obj.length]; // 初始化中间数组  
  161.   
  162.          mergeSort(obj, 0, obj.length - 1); // 归并排序  
  163.   
  164.          bridge = null;  
  165.   
  166.      }  
  167.   
  168.      private void mergeSort(double[] obj, int left, int right){  
  169.   
  170.          if (left < right){  
  171.   
  172.               int center = (left + right) / 2;  
  173.   
  174.               mergeSort(obj, left, center);  
  175.   
  176.               mergeSort(obj, center + 1, right);  
  177.   
  178.               merge(obj, left, center, right);  
  179.   
  180.          }  
  181.   
  182.      }  
  183.   
  184.      private void merge(double[] obj, int left,  
  185.   
  186. int center, int right){  
  187.   
  188.          int mid = center + 1;  
  189.   
  190.          int third = left;  
  191.   
  192.          int tmp = left;  
  193.   
  194.          while (left <= center && mid <= right){  
  195.   
  196. // 从两个数组中取出小的放入中间数组  
  197.   
  198.               if (obj[left]-obj[mid]<=10e-6){  
  199.   
  200.                    bridge[third++] = obj[left++];  
  201.   
  202.               } else{  
  203.   
  204.                    bridge[third++] = obj[mid++];  
  205.   
  206.               }  
  207.   
  208.          }  
  209.   
  210.    
  211.   
  212.          // 剩余部分依次置入中间数组  
  213.   
  214.          while (mid <= right){  
  215.   
  216.               bridge[third++] = obj[mid++];  
  217.   
  218.          }  
  219.   
  220.          while (left <= center){  
  221.   
  222.               bridge[third++] = obj[left++];  
  223.   
  224.          }  
  225.   
  226.          // 将中间数组的内容拷贝回原数组  
  227.   
  228.          copy(obj, tmp, right);  
  229.   
  230.      }  
  231.   
  232.      private void copy(double[] obj, int left, int right)  
  233.   
  234.      {  
  235.   
  236.          while (left <= right){  
  237.   
  238.               obj[left] = bridge[left];  
  239.   
  240.               left++;  
  241.   
  242.          }  
  243.   
  244.      }  
  245.   
  246.      public static void main(String[] args) {  
  247.   
  248.          Random random = new Random(6);  
  249.   
  250.    
  251.   
  252.          int arraysize = 10;  
  253.   
  254.          double[] sorted = new double[arraysize];  
  255.   
  256.          System.out.print("Before Sort:");  
  257.   
  258.          for (int j = 0; j < arraysize; j++) {  
  259.   
  260.               sorted[j] = (int) (random.nextDouble() * 100);  
  261.   
  262.               System.out.print((int) sorted[j] + " ");  
  263.   
  264.          }  
  265.   
  266.          System.out.println();  
  267.   
  268.    
  269.   
  270.          MergeSort sorter = new MergeSort();  
  271.   
  272.          sorter.sort(sorted);  
  273.   
  274.           
  275.   
  276.          System.out.print("After Sort:");  
  277.   
  278.          for (int j = 0; j < sorted.length; j++) {  
  279.   
  280.               System.out.print((int) sorted[j] + " ");  
  281.   
  282.          }  
  283.   
  284.          System.out.println();  
  285.   
  286.      }  
  287.   
  288. }  


8)基数排序:

使用10个辅助队列,假设最大数的数字位数为 x, 则一共做 x次,从个位数开始往前,以第i位数字的大小为依据,将数据放进辅助队列,搞定之后回收。下次再以高一位开始的数字位为依据。

以Vector作辅助队列,基数排序的Java代码:

Java代码
Java代码 复制代码
  1. public class RadixSort {      
  2.      
  3.      private int keyNum=-1;         
  4.      
  5.      private Vector<Vector<Double>> util;      
  6.      
  7.           
  8.      
  9.      public void distribute(double [] sorted, int nth){             
  10.      
  11.          if(nth<=keyNum && nth>0){      
  12.      
  13.               util=new Vector<Vector<Double>>();      
  14.      
  15.               for(int j=0;j<10;j++){      
  16.      
  17.                    Vector <Double> temp= new Vector <Double>();      
  18.      
  19.                    util.add(temp);      
  20.      
  21.               }                  
  22.      
  23.               for(int j=0;j<sorted.length;j++){      
  24.      
  25.                    int index= getNthDigit(sorted[j],nth);      
  26.      
  27.                    util.get(index).add(sorted[j]);      
  28.      
  29.               }      
  30.      
  31.          }      
  32.      
  33.      }         
  34.      
  35.      public int getNthDigit(double num,int nth){      
  36.      
  37.          String nn= Integer.toString((int)num);      
  38.      
  39.          int len= nn.length();      
  40.      
  41.          if(len>=nth){      
  42.      
  43.               return Character.getNumericValue(nn.charAt(len-nth));       
  44.      
  45.          }else{      
  46.      
  47.               return 0;      
  48.      
  49.          }                  
  50.      
  51.      }      
  52.      
  53.      public void collect(double [] sorted){      
  54.      
  55.          int k=0;      
  56.      
  57.          for(int j=0;j<10;j++){      
  58.      
  59.               int len= util.get(j).size();      
  60.      
  61.               if(len>0){      
  62.      
  63.                    for(int i=0;i<len;i++){      
  64.      
  65.                        sorted[k++]= util.get(j).get(i);      
  66.      
  67.                    }      
  68.      
  69.               }      
  70.      
  71.          }      
  72.      
  73.          util=null;      
  74.      
  75.      }      
  76.      
  77.      public int getKeyNum(double [] sorted){          
  78.      
  79.          double max= Double.MIN_VALUE;      
  80.      
  81.          for(int j=0;j<sorted.length;j++){      
  82.      
  83.               if(sorted[j]>max){      
  84.      
  85.                    max= sorted[j];      
  86.      
  87.               }      
  88.      
  89.          }             
  90.      
  91.          return Integer.toString((int)max).length();      
  92.      
  93.      }      
  94.      
  95.      public void radixSort(double [] sorted){      
  96.      
  97.          if(keyNum==-1){                  
  98.      
  99.               keyNum= getKeyNum(sorted);      
  100.      
  101.          }      
  102.      
  103.          for(int i=1;i<=keyNum;i++){      
  104.      
  105.               distribute(sorted,i);      
  106.      
  107.               collect(sorted);                 
  108.      
  109.          }      
  110.      
  111.      }      
  112.      
  113.      public static void main(String[] args) {      
  114.      
  115.          Random random = new Random(6);      
  116.      
  117.        
  118.      
  119.          int arraysize = 21;      
  120.      
  121.          double[] sorted = new double[arraysize];      
  122.      
  123.          System.out.print("Before Sort:");      
  124.      
  125.          for (int j = 0; j < arraysize; j++) {      
  126.      
  127.               sorted[j] = (int) (random.nextDouble() * 100);      
  128.      
  129.               System.out.print((int) sorted[j] + " ");      
  130.      
  131.          }      
  132.      
  133.          System.out.println();      
  134.      
  135.        
  136.      
  137.          RadixSort sorter = new RadixSort();      
  138.      
  139.          sorter.radixSort(sorted);      
  140.      
  141.               
  142.      
  143.          System.out.print("After Sort:");      
  144.      
  145.          for (int j = 0; j < sorted.length; j++) {      
  146.      
  147.               System.out.print((int) sorted[j] + " ");      
  148.      
  149.          }      
  150.      
  151.          System.out.println();      
  152.      
  153.      }      
  154.      
  155. }     
  156.   
  157. public class RadixSort {   
  158.   
  159.      private int keyNum=-1;      
  160.   
  161.      private Vector<Vector<Double>> util;   
  162.   
  163.        
  164.   
  165.      public void distribute(double [] sorted, int nth){          
  166.   
  167.          if(nth<=keyNum && nth>0){   
  168.   
  169.               util=new Vector<Vector<Double>>();   
  170.   
  171.               for(int j=0;j<10;j++){   
  172.   
  173.                    Vector <Double> temp= new Vector <Double>();   
  174.   
  175.                    util.add(temp);   
  176.   
  177.               }               
  178.   
  179.               for(int j=0;j<sorted.length;j++){   
  180.   
  181.                    int index= getNthDigit(sorted[j],nth);   
  182.   
  183.                    util.get(index).add(sorted[j]);   
  184.   
  185.               }   
  186.   
  187.          }   
  188.   
  189.      }      
  190.   
  191.      public int getNthDigit(double num,int nth){   
  192.   
  193.          String nn= Integer.toString((int)num);   
  194.   
  195.          int len= nn.length();   
  196.   
  197.          if(len>=nth){   
  198.   
  199.               return Character.getNumericValue(nn.charAt(len-nth));    
  200.   
  201.          }else{   
  202.   
  203.               return 0;   
  204.   
  205.          }               
  206.   
  207.      }   
  208.   
  209.      public void collect(double [] sorted){   
  210.   
  211.          int k=0;   
  212.   
  213.          for(int j=0;j<10;j++){   
  214.   
  215.               int len= util.get(j).size();   
  216.   
  217.               if(len>0){   
  218.   
  219.                    for(int i=0;i<len;i++){   
  220.   
  221.                        sorted[k++]= util.get(j).get(i);   
  222.   
  223.                    }   
  224.   
  225.               }   
  226.   
  227.          }   
  228.   
  229.          util=null;   
  230.   
  231.      }   
  232.   
  233.      public int getKeyNum(double [] sorted){       
  234.   
  235.          double max= Double.MIN_VALUE;   
  236.   
  237.          for(int j=0;j<sorted.length;j++){   
  238.   
  239.               if(sorted[j]>max){   
  240.   
  241.                    max= sorted[j];   
  242.   
  243.               }   
  244.   
  245.          }          
  246.   
  247.          return Integer.toString((int)max).length();   
  248.   
  249.      }   
  250.   
  251.      public void radixSort(double [] sorted){   
  252.   
  253.          if(keyNum==-1){               
  254.   
  255.               keyNum= getKeyNum(sorted);   
  256.   
  257.          }   
  258.   
  259.          for(int i=1;i<=keyNum;i++){   
  260.   
  261.               distribute(sorted,i);   
  262.   
  263.               collect(sorted);              
  264.   
  265.          }   
  266.   
  267.      }   
  268.   
  269.      public static void main(String[] args) {   
  270.   
  271.          Random random = new Random(6);   
  272.   
  273.     
  274.   
  275.          int arraysize = 21;   
  276.   
  277.          double[] sorted = new double[arraysize];   
  278.   
  279.          System.out.print("Before Sort:");   
  280.   
  281.          for (int j = 0; j < arraysize; j++) {   
  282.   
  283.               sorted[j] = (int) (random.nextDouble() * 100);   
  284.   
  285.               System.out.print((int) sorted[j] + " ");   
  286.   
  287.          }   
  288.   
  289.          System.out.println();   
  290.   
  291.     
  292.   
  293.          RadixSort sorter = new RadixSort();   
  294.   
  295.          sorter.radixSort(sorted);   
  296.   
  297.            
  298.   
  299.          System.out.print("After Sort:");   
  300.   
  301.          for (int j = 0; j < sorted.length; j++) {   
  302.   
  303.               System.out.print((int) sorted[j] + " ");   
  304.   
  305.          }   
  306.   
  307.          System.out.println();   
  308.   
  309.      }   
  310.   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值