A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 狼王 高级黑马   /  2013-10-6 20:18  /  1282 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

  263.         }  
  264.          return array;  
  265.      }      
  266. }
  267. </p><p><span class="xg1"></span> </p>
复制代码

1 个回复

倒序浏览
很不错,我慢慢研究下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马