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