快序排序/mergeSort的运用实例(同步与54bk.com上的发表)

来源:互联网 发布:maya mac 2016 破解 编辑:程序博客网 时间:2024/04/27 12:45
 在工作中遇到这样的需求:例如String[] strArray={"34","er","ee","23","56","er","34","34"};现在需要统计有多少种字符串,每种有几个(需要记录下来),最后需要每种个数从大到小排列,并且记录每种占总个数的百分比。结果数组类似String[][] strArrayDouble={{"34",3},{"er",2},{"ee",1},{"23",1}}。实际使用中的数组比较大,需要承受几万到几十万个字符串的排序。

(1)通过merge排序,把相同字符串排在了一起,这个我们直接使用java的排序方法;

(2)分类统计,例如strArray数组中有多少种字符串;

 (3)统计每种字符串各有多少个;

 (4)按照个数多少进行排序,并进行结果赋值(组装成一个二维数组)。

源代码如下:

package common;

import java.util.*;

public class QuickSort {
  public QuickSort() {
  }

    /**
   * swap
   * 交换权值,使之从大到小排列
   *
   * @param darray double[] 权值数组
   * @param i int
   * @param j int
   */
  private static void swap(double[] darray, int i, int j) {
    double t;
    t = darray[i];
    darray[i] = darray[j];
    darray[j] = t;
  }

  /**
   * mergeSort
   * 对数字或者字符串都可以排序
   * 先让相同的对象排在一起,再进一步分析、排序
   * @param strarray String[] 要排序的字符串数组或者数字数组
   * @return String[][] 返回结果数组,记录排序后的百分比,次数
   */
  public static String[][] logSort(String[] strarray) {
    String[][] resArray = null;
    if (strarray != null) {
      Arrays.sort(strarray); //先排序,使得相同的对象排在一起
      /*
           for (int i = 0; i < strarray.length; i++) {
            System.out.print(strarray[i] + " ");
           }
       */
      int uniqueNumbers = 0;
      String biao = "";
      for (int i = 0; i < strarray.length; i++) {
        if (!strarray[i].equals(biao)) {

          uniqueNumbers++; //记录不同对象种类数
          biao = strarray[i];
        }
      }
      //System.out.print(uniqueNumbers);

      resArray = new String[uniqueNumbers][3]; //返回结果数组
      String[] name = new String[uniqueNumbers]; //记录名称
      double[] cishu = new double[uniqueNumbers]; //记录次数

      int uniqueIndex = 0;
      int m = strarray.length;
      for (int i = 0; i < strarray.length; ) {
        biao = strarray[i];
        int j = 1;
        //循环找到相同值的个数
        for (; i + j < strarray.length && strarray[i + j].equals(biao); j++) {
          ;
        }

        name[uniqueIndex] = biao;//值
        cishu[uniqueIndex] = j;//记录次数
        //resArray[uniqueIndex][0] = biao; //值
        //resArray[uniqueIndex][1] = String.valueOf(j); //记录次数
        //resArray[uniqueIndex][2] = String.valueOf( (double) j / (double) m *100) +"%"; //百分比

        uniqueIndex++;
        i = i + j; //跳到下一个值
      }

      //进行最后排序
      finalsort(cishu, name);
      //组装结果数组
      for (int n = 0; n < cishu.length; n++) {
        resArray[n][0] = name[n];
        resArray[n][1] = String.valueOf(cishu[n]);
        resArray[n][2] = String.valueOf(cishu[n] / m * 100);
      }
    }
    return resArray;
  }

  /*-------------------------------------*/
  /**
   *
   * @param darray double[] 字符串对象出现次数数组
   * @param anther String[] 字符串数组
   */
  private static void finalsort(double[] darray, String[] anther) {
    thirdsort(darray, 0, darray.length - 1, anther);
  }

  private static void thirdsort(double[] darray, int left, int right,
                                String[] anther) {
    if (left < right) {

      //先找到中心轴
      int q = partition(darray, left, right, anther);
      //对中心轴左边遍历
      thirdsort(darray, left, q - 1, anther);
      //对中心轴右边遍历
      thirdsort(darray, q + 1, right, anther);
    }

  }

  private static int partition(double[] darray, int left, int right,
                               String[] anther) {
    //先以右边最后一个元素为轴
    double s = darray[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
      if (darray[j] >= s) {
        i++;
        swap(darray, i, j);
        swpResult(anther, i, j);
      }
    }

    //交换值
    swap(darray, i + 1, right);
    swpResult(anther, i + 1, right);
    return i + 1;
  }

  /**
   * 交换anther数组的值,主要根据次数大小顺序交换顺序
   * @param String[] anther
   * @param i int
   * @param j int
   */
  private static void swpResult(String[] anther, int i, int j) {
    String r;
    r = anther[i];
    anther[i] = anther[j];
    anther[j] = r;
  }

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

大家看到了,我使用了merge,快序排序(实际上就是冒泡的该良),在以前快序排序的参数中增加了一个数组,实质没有改变。通过实际几万个字符串使用情况看,速度还比较快,但是希望最后快序排序能改进更快,看到这篇文章的朋友有的话请给出源代码,万分感谢。