文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>各种数组排序方法总结

各种数组排序方法总结

时间:2010-03-02  来源:sunwei0325

Java代码
  1. import java.lang.Math;   
  2. import java.util.Random;   
  3.   
  4. /**  
  5.  * 排序  
  6.  *   
  7.  * @author javajack    
  8.  */  
  9. public class OrderTest {   
  10.   
  11.     public static void main(String args[]) {   
  12.         OrderTest.ExecOrder(2);   
  13.     }   
  14.   
  15.     /**  
  16.      * 交换值,交换数组的两个值  
  17.      * @param array  
  18.      * @param i  
  19.      * @param j  
  20.      */  
  21.     private static void swap(int[] array,int i, int j)   
  22.     {   
  23.         int tmp = array[i];   
  24.         array[i] = array[j];   
  25.         array[j] = tmp;   
  26.     }      
  27.        
  28.     /**  
  29.      *   
  30.      * @param method  
  31.      *            1为升序,2为降序  
  32.      */  
  33.     public static void ExecOrder(int method) {   
  34.         int[] array = null;   
  35.         array = initArray(10, 210, 10);   
  36.            
  37.          //int[] orderarray = bubbleOrder(array,method);   
  38.         int[] orderarray = doubleBubbleOrder(array,method);   
  39.         //int[] orderarray = insertOrder(array, method);   
  40.         //int [] orderarray = quickOrder(array,method);   
  41.         //int[] orderarray = selectOrder(array, method);   
  42.         for (int i = 0; i < orderarray.length; i++) {   
  43.             System.out.println(orderarray[i]);   
  44.         }   
  45.     }   
  46.   
  47.     /**  
  48.      * 取随机数据,初始化一个数组  
  49.      *   
  50.      * @param min  
  51.      *            随机数的最小值  
  52.      * @param max  
  53.      *            最大值  
  54.      * @param size  
  55.      *            取得随机数的数量  
  56.      * @return  
  57.      */  
  58.     public static int[] initArray(int min, int max, int size) {   
  59.         int[] init = new int[size];   
  60.   
  61.         for (int i = 0; i < size; i++) {   
  62.             Random ra = new Random();   
  63.             init[i] = min + (int) (Math.random() * (max - min + 1));   
  64.             System.out.println(i + "-------" + init[i]);   
  65.         }   
  66.         return init;   
  67.     }   
  68.   
  69.     /**  
  70.      * 交换排序方法  
  71.      * 原理:依次交换值  
  72.      * @param array  
  73.      * @return  
  74.      */  
  75.     public static int[] convertOrder(int[] array, int method) {   
  76.         for (int i = 0; i < array.length; i++) {   
  77.             for (int j = i + 1; j < array.length; j++)    
  78.             {   
  79.                 if (method==2)   
  80.                 {   
  81.                     if (array[i] < array[j])    
  82.                         swap(array,i,j);   
  83.                 }else if (method == 1) {   
  84.                     if (array[i] > array[j])    
  85.                         swap(array,i,j);   
  86.                 }   
  87.             }   
  88.         }   
  89.         return array;   
  90.     }   
  91.   
  92.     /**冒泡排序方法  
  93.      * 原理:从最后一个开始将小的或大的逐渐冒出  
  94.      * @param array  
  95.      * @param method  
  96.      * @return  
  97.      */  
  98.     public static int[] bubbleOrder(int[] array,int method)   
  99.     {   
  100.         for(int i=0;i<array.length;i++)   
  101.         {   
  102.             for (int j=array.length -1 ;j>i;j--)   
  103.             {   
  104.                 if (method==2)   
  105.                 {   
  106.                     if (array[i] < array[j])   
  107.                         swap(array,i,j);   
  108.                 }else if (method==1)   
  109.                     if (array[i] > array[j])   
  110.                         swap(array,i,j);   
  111.             }   
  112.         }   
  113.         return array;   
  114.     }   
  115.        
  116.     /**  
  117.      * 双向冒泡排序  
  118.      * 原理:类似于冒泡排序,只不过是双向的  
  119.      * @param array  
  120.      * @param method  
  121.      * @return  
  122.      */  
  123.     public static int[] doubleBubbleOrder(int[] array,int method)   
  124.     {   
  125.         int left = 0;   
  126.         int right = array.length -1 ;   
  127.         while (left < right)   
  128.         {   
  129.             for(int i=left;i<=right;i++)   
  130.             {   
  131.                 if (method==1)   
  132.                 {   
  133.                     if (array[left] > array[i])   
  134.                         swap(array,left,i);   
  135.                 }else  
  136.                 {   
  137.                     if (array[left] < array[i])   
  138.                         swap(array,left,i);   
  139.                 }   
  140.             }   
  141.                
  142.             for (int i=left+1;i<=right;i++)   
  143.             {   
  144.                 if (method==1)   
  145.                 {   
  146.                     if (array[right] < array[i])   
  147.                         swap(array,right,i);   
  148.                 }else  
  149.                 {   
  150.                     if (array[right] > array[i])   
  151.                         swap(array,right,i);   
  152.                        
  153.                 }   
  154.             }   
  155.             left++;   
  156.             right--;   
  157.         }   
  158.         return array;   
  159.     }   
  160.        
  161.     /**  
  162.      * 快速排序方法,运用到递归  
  163.      * 排序原理:随机找到一个值,然后以此值大小进行分为两个数组,大的放左边,小的放右边,  
  164.      * 然后再对左右两侧的数据依次排序根据  
  165.      * @param array  
  166.      * @param method  
  167.      * @return  
  168.      */  
  169.     public static int[] quickOrder(int[] array, int method)    
  170.     {   
  171.         quickDeal(array,0,array.length - 1,method);   
  172.         return array;   
  173.     }   
  174.   
  175.     /**  
  176.      *   
  177.      * @param array  
  178.      * @param begin  
  179.      *            开始位置  
  180.      * @param end  
  181.      *            结束位置  
  182.      */  
  183.     private static void quickDeal(int[] array, int begin, int end,int method) {   
  184.         if (end > begin) {   
  185.             int pos = begin + (int) (Math.random() * (end - begin + 1)); // 计算分隔位置   
  186.             int posvalue = array[pos]; // 取得分隔位置的值   
  187.             swap(array,pos,end); //将posvalue放到最end的位置   
  188.             pos=begin; //初始化pos   
  189.             for (int i=begin; i < end; i++) {   
  190.                 if (method==1)   
  191.                 {      
  192.                     if (array[i] < posvalue) { //当小于posvalue时,将此值移动到pos位置,也就是向前移动   
  193.                         swap(array,pos,i);    
  194.                         pos++; //移动后pos增1   
  195.                     }   
  196.                 }else if(method == 2)   
  197.                 {   
  198.                     if (array[i] > posvalue) { //当小于posvalue时,将此值移动到pos位置,也就是向前移动   
  199.                         swap(array,pos,i);    
  200.                         pos++; //移动后pos增1   
  201.                     }   
  202.                 }   
  203.             }   
  204.             swap(array,pos,end); //end位置的值前移   
  205.             quickDeal(array,begin,pos -1,method);   
  206.             quickDeal(array,pos+1,end,method);   
  207.         }   
  208.   
  209.     }   
  210.   
  211.     /**  
  212.      * 插入排序方法  
  213.      * 排序原理:抽出一个数,做为排序基序列,然后依次抽出其它数与,与此序列中的数进行比较,放入合适的位置  
  214.      * @param array  
  215.      * @param method  
  216.      * @return  
  217.      */  
  218.     public static int[] insertOrder(int[] array, int method) {   
  219.   
  220.         for (int i = 1; i < array.length; i++) {   
  221.             if (method == 1) {   
  222.                 if (array[i - 1] > array[i]) {   
  223.                     int tmp = array[i]; //   
  224.                     int j = i - 1;   
  225.                     do {   
  226.                         array[j + 1] = array[j];   
  227.                         j--;   
  228.                     } while (j >= 0 && tmp < array[j]); //当j>=0并且 当前值大于数据中j位置的值时移动   
  229.                     array[j + 1] = tmp; //插入排序值   
  230.                 }   
  231.             } else if (method == 2) {   
  232.                 if (array[i - 1] < array[i]) {   
  233.                     int tmp = array[i];    
  234.                     int j = i - 1;   
  235.                     do {   
  236.                         array[j + 1] = array[j];   
  237.                         j--;   
  238.                     } while (j >= 0 && tmp > array[j]);   
  239.                     array[j + 1] = tmp;   
  240.                 }   
  241.             }   
  242.         }   
  243.         return array;   
  244.     }   
  245.   
  246.     /**  
  247.      * 选择排序方法  
  248.      * 排序原理:每次选择一个最大的或最小的数放到已排序序列中  
  249.      * @param array  
  250.      * @param method  
  251.      * @return  
  252.      */  
  253.     public static int[] selectOrder(int[] array,int method)   
  254.     {   
  255.         for (int i=0;i<array.length - 1;i++)    
  256.         {   
  257.             int tmp = array[i];   
  258.             int pos = i+1; //记录大值或小值的位置    
  259.             for (int j=i+1;j<array.length;j++)   
  260.             {   
  261.                 if (method==1)   
  262.                 {   
  263.                     if (array[j]<tmp)   
  264.                     {   
  265.                         tmp = array[j];   
  266.                         pos= j ;//记录大值或小值的位置   
  267.                     }   
  268.                 }else if (method==2)   
  269.                 {   
  270.                     if (array[j]>tmp)   
  271.                     {   
  272.                         tmp = array[j];   
  273.                         pos= j ;//记录大值或小值的位置   
  274.                     }   
  275.                 }   
  276.             }   
  277.             if (tmp != array[i])   
  278.                 swap(array,i,pos); //不相同时交换   
  279.         }   
  280.         return array;   
  281.     }   
  282.   
  283.        
  284. }  
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载