Java实现的排序算法

来源:互联网 发布:我的世界手机版大型js 编辑:程序博客网 时间:2024/05/07 03:10
Java各种排序算法 
1)分类: 
1)插入排序(直接插入排序、希尔排序) 
2)交换排序(冒泡排序、快速排序) 
3)选择排序(直接选择排序、堆排序) 
4)归并排序 
5)分配排序(箱排序、基数排序) 
所需辅助空间最多:归并排序 
所需辅助空间最少:堆排序 
平均速度最快:快速排序 
不稳定:快速排序,希尔排序,堆排序。 
2)选择排序算法的时候 
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):先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。 

public class InsertionSort {


// 插入排序:直接插入排序,希尔排序


public void straightInsertionSort(double[] sorted) {
int sortedLen = sorted.length;
for (int j = 2; j < sortedLen; j++) {
if (sorted[j] < sorted[j - 1]) {
sorted[0] = sorted[j];// 先保存一下后面的那个
sorted[j] = sorted[j - 1];// 前面的那个后移。
int insertPos = 0;
for (int k = j - 2; k >= 0; k--) {
if (sorted[k] > sorted[0]) {
sorted[k + 1] = sorted[k];
} else {
insertPos = k + 1;
break;
}
}
sorted[insertPos] = sorted[0];
}
}
}


public void shellInertionSort(double[] sorted, int inc) {
int sortedLen = sorted.length;
for (int j = inc + 1; j < sortedLen; j++) {
if (sorted[j] < sorted[j - inc]) {
sorted[0] = sorted[j];// 先保存一下后面的那个
int insertPos = j;
for (int k = j - inc; k >= 0; k -= inc) {
if (sorted[k] > sorted[0]) {
sorted[k + inc] = sorted[k];
// 数据结构课本上这个地方没有给出判读,出错:
if (k - inc <= 0) {
insertPos = k;
}
} else {
insertPos = k + inc;
break;
}
}
sorted[insertPos] = sorted[0];
}
}
}


public void shellInsertionSort(double[] sorted) {
int[] incs = { 7, 5, 3, 1 };
int num = incs.length;
int inc = 0;
for (int j = 0; j < num; j++) {
inc = incs[j];
shellInertionSort(sorted, inc);
}
}


public static void main(String[] args) {
Random random = new Random(6);
int arraysize = 21;
double[] sorted = new double[arraysize];
System.out.print("Before Sort:");
for (int j = 1; j < arraysize; j++) {
sorted[j] = (int) (random.nextDouble() * 100);
System.out.print((int) sorted[j] + " ");
}


System.out.println();
InsertionSort sorter = new InsertionSort();
// sorter.straightInsertionSort(sorted);
sorter.shellInsertionSort(sorted);
System.out.print("After Sort:");
for (int j = 1; j < sorted.length; j++) {
System.out.print((int) sorted[j] + " ");
}
System.out.println();
}
}


public class InsertionSort {
// 插入排序:直接插入排序,希尔排序
public void straightInsertionSort(double[] sorted) {
int sortedLen = sorted.length;
for (int j = 2; j < sortedLen; j++) {
if (sorted[j] < sorted[j - 1]) {
sorted[0] = sorted[j];// 先保存一下后面的那个
sorted[j] = sorted[j - 1];// 前面的那个后移。
int insertPos = 0;
for (int k = j - 2; k >= 0; k--) {
if (sorted[k] > sorted[0]) {
sorted[k + 1] = sorted[k];
} else {
insertPos = k + 1;
break;
}
}
sorted[insertPos] = sorted[0];
}
}
}


public void shellInertionSort(double[] sorted, int inc) {
int sortedLen = sorted.length;
for (int j = inc + 1; j < sortedLen; j++) {
if (sorted[j] < sorted[j - inc]) {
sorted[0] = sorted[j];// 先保存一下后面的那个
int insertPos = j;
for (int k = j - inc; k >= 0; k -= inc) {
if (sorted[k] > sorted[0]) {
sorted[k + inc] = sorted[k];
// 数据结构课本上这个地方没有给出判读,出错:
if (k - inc <= 0) {
insertPos = k;
}
} else {
insertPos = k + inc;
break;
}
}


sorted[insertPos] = sorted[0];
}
}
}
public void shellInsertionSort(double[] sorted) {
int[] incs = { 7, 5, 3, 1 };
int num = incs.length;
int inc = 0;
for (int j = 0; j < num; j++) {
inc = incs[j];
shellInertionSort(sorted, inc);
}
}
public static void main(String[] args) {
Random random = new Random(6);
int arraysize = 21;
double[] sorted = new double[arraysize];
System.out.print("Before Sort:");
for (int j = 1; j < arraysize; j++) {
sorted[j] = (int) (random.nextDouble() * 100);
System.out.print((int) sorted[j] + " ");
}
System.out.println();
InsertionSort sorter = new InsertionSort();
// sorter.straightInsertionSort(sorted);
sorter.shellInsertionSort(sorted);
System.out.print("After Sort:");
for (int j = 1; j < sorted.length; j++) {
System.out.print((int) sorted[j] + " ");
}
System.out.println();
}
}


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. }  

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. }  

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. }  

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.      public void distribute(double [] sorted, int nth){            
  7.     
  8.          if(nth<=keyNum && nth>0){     
  9.     
  10.               util=new Vector<Vector<Double>>();     
  11.     
  12.               for(int j=0;j<10;j++){     
  13.     
  14.                    Vector <Double> temp= new Vector <Double>();     
  15.     
  16.                    util.add(temp);     
  17.     
  18.               }                 
  19.     
  20.               for(int j=0;j<sorted.length;j++){     
  21.     
  22.                    int index= getNthDigit(sorted[j],nth);     
  23.     
  24.                    util.get(index).add(sorted[j]);     
  25.     
  26.               }     
  27.     
  28.          }     
  29.     
  30.      }        
  31.     
  32.      public int getNthDigit(double num,int nth){     
  33.     
  34.          String nn= Integer.toString((int)num);     
  35.     
  36.          int len= nn.length();     
  37.     
  38.          if(len>=nth){     
  39.     
  40.               return Character.getNumericValue(nn.charAt(len-nth));      
  41.     
  42.          }else{     
  43.     
  44.               return 0;     
  45.     
  46.          }                 
  47.     
  48.      }     
  49.     
  50.      public void collect(double [] sorted){     
  51.     
  52.          int k=0;     
  53.     
  54.          for(int j=0;j<10;j++){     
  55.     
  56.               int len= util.get(j).size();     
  57.     
  58.               if(len>0){     
  59.     
  60.                    for(int i=0;i<len;i++){     
  61.     
  62.                        sorted[k++]= util.get(j).get(i);     
  63.     
  64.                    }     
  65.     
  66.               }     
  67.     
  68.          }     
  69.     
  70.          util=null;     
  71.     
  72.      }     
  73.     
  74.      public int getKeyNum(double [] sorted){         
  75.     
  76.          double max= Double.MIN_VALUE;     
  77.     
  78.          for(int j=0;j<sorted.length;j++){     
  79.     
  80.               if(sorted[j]>max){     
  81.     
  82.                    max= sorted[j];     
  83.     
  84.               }     
  85.     
  86.          }            
  87.     
  88.          return Integer.toString((int)max).length();     
  89.     
  90.      }     
  91.     
  92.      public void radixSort(double [] sorted){     
  93.     
  94.          if(keyNum==-1){                 
  95.     
  96.               keyNum= getKeyNum(sorted);     
  97.     
  98.          }     
  99.     
  100.          for(int i=1;i<=keyNum;i++){     
  101.     
  102.               distribute(sorted,i);     
  103.     
  104.               collect(sorted);                
  105.     
  106.          }     
  107.     
  108.      }     
  109.     
  110.      public static void main(String[] args) {     
  111.     
  112.          Random random = new Random(6);     

  113.          int arraysize = 21;     
  114.     
  115.          double[] sorted = new double[arraysize];     
  116.     
  117.          System.out.print("Before Sort:");     
  118.     
  119.          for (int j = 0; j < arraysize; j++) {     
  120.     
  121.               sorted[j] = (int) (random.nextDouble() * 100);     
  122.     
  123.               System.out.print((int) sorted[j] + " ");     
  124.     
  125.          }     
  126.     
  127.          System.out.println();     

  128.          RadixSort sorter = new RadixSort();     
  129.     
  130.          sorter.radixSort(sorted);     

  131.          System.out.print("After Sort:");     
  132.     
  133.          for (int j = 0; j < sorted.length; j++) {     
  134.     
  135.               System.out.print((int) sorted[j] + " ");     
  136.     
  137.          }     
  138.     
  139.          System.out.println();     
  140.     
  141.      }     
  142.     
  143. }    
  144.   
  145. public class RadixSort {  
  146.   
  147.      private int keyNum=-1;     
  148.   
  149.      private Vector<Vector<Double>> util;  
  150.   
  151.       
  152.   
  153.      public void distribute(double [] sorted, int nth){         
  154.   
  155.          if(nth<=keyNum && nth>0){  
  156.   
  157.               util=new Vector<Vector<Double>>();  
  158.   
  159.               for(int j=0;j<10;j++){  
  160.   
  161.                    Vector <Double> temp= new Vector <Double>();  
  162.   
  163.                    util.add(temp);  
  164.   
  165.               }              
  166.   
  167.               for(int j=0;j<sorted.length;j++){  
  168.   
  169.                    int index= getNthDigit(sorted[j],nth);  
  170.   
  171.                    util.get(index).add(sorted[j]);  
  172.   
  173.               }  
  174.   
  175.          }  
  176.   
  177.      }     
  178.   
  179.      public int getNthDigit(double num,int nth){  
  180.   
  181.          String nn= Integer.toString((int)num);  
  182.   
  183.          int len= nn.length();  
  184.   
  185.          if(len>=nth){  
  186.   
  187.               return Character.getNumericValue(nn.charAt(len-nth));   
  188.   
  189.          }else{  
  190.   
  191.               return 0;  
  192.   
  193.          }              
  194.   
  195.      }  
  196.   
  197.      public void collect(double [] sorted){  
  198.   
  199.          int k=0;  
  200.   
  201.          for(int j=0;j<10;j++){  
  202.   
  203.               int len= util.get(j).size();  
  204.   
  205.               if(len>0){  
  206.   
  207.                    for(int i=0;i<len;i++){  
  208.   
  209.                        sorted[k++]= util.get(j).get(i);  
  210.   
  211.                    }  
  212.   
  213.               }  
  214.   
  215.          }  
  216.   
  217.          util=null;  
  218.   
  219.      }  
  220.   
  221.      public int getKeyNum(double [] sorted){      
  222.   
  223.          double max= Double.MIN_VALUE;  
  224.   
  225.          for(int j=0;j<sorted.length;j++){  
  226.   
  227.               if(sorted[j]>max){  
  228.   
  229.                    max= sorted[j];  
  230.   
  231.               }  
  232.   
  233.          }         
  234.   
  235.          return Integer.toString((int)max).length();  
  236.   
  237.      }  
  238.   
  239.      public void radixSort(double [] sorted){  
  240.   
  241.          if(keyNum==-1){              
  242.   
  243.               keyNum= getKeyNum(sorted);  
  244.   
  245.          }  
  246.   
  247.          for(int i=1;i<=keyNum;i++){  
  248.   
  249.               distribute(sorted,i);  
  250.   
  251.               collect(sorted);             
  252.          }  
  253.   
  254.      }  
  255.   
  256.      public static void main(String[] args) {  
  257.   
  258.          Random random = new Random(6);  

  259.          int arraysize = 21;  
  260.   
  261.          double[] sorted = new double[arraysize];  
  262.   
  263.          System.out.print("Before Sort:");  
  264.   
  265.          for (int j = 0; j < arraysize; j++) {  
  266.   
  267.               sorted[j] = (int) (random.nextDouble() * 100);  
  268.   
  269.               System.out.print((int) sorted[j] + " ");  
  270.   
  271.          }  
  272.   
  273.          System.out.println();  

  274.          RadixSort sorter = new RadixSort();  
  275.   
  276.          sorter.radixSort(sorted);  

  277.          System.out.print("After Sort:");  
  278.   
  279.          for (int j = 0; j < sorted.length; j++) {  
  280.   
  281.               System.out.print((int) sorted[j] + " ");  
  282.   
  283.          }  
  284.   
  285.          System.out.println();  
  286.   
  287.      }  
  288.   
  289. }  

=====》总结:上述Java代码中,基本上用的都是double数组,如果想要应用其他的数组,只需要将double数组改成 Comparable接口数组,凡是实现了Comparable接口的都可以用。而在C++中,是用模板类来解决这个问题。

0 0