java实现6种字符串数组的排序(String array sort)
程序员文章站
2022-05-30 13:06:19
注意,本文不是字符串排序,是字符串数组的排序。
方法分别是:
1、低位优先键索引排序
2、高位优先建索引排序
3、java自带排序(经过调优的归并排序)
4、冒泡排序
5、...
注意,本文不是字符串排序,是字符串数组的排序。
方法分别是:
1、低位优先键索引排序
2、高位优先建索引排序
3、java自带排序(经过调优的归并排序)
4、冒泡排序
5、快速排序
6、三向快速排序
时间复杂度:
- 最慢的肯定是冒泡,o(n的平方)
- 最快的是快速排序,平均 o(nlogn)
- 低位优先,o(nw),w是字符串长度,在字符串长度较短情况下和快速排序时间应该很接近
- 高位优先,o(n) - o(nw)
- 三向快速排序,o(n) - o(nw)
本文中使用的例子是一个5757行的随机字符串数组文本txt,实际测试结果:
- 低位优先键索引排序:5 ms
- 高位优先键索引排序:8 ms
- java自带排序:9 ms
- 冒泡排序:284 ms
- 快速排序:8 ms
- 三向快速排序:12 ms
稳定的排序是:
- 低位优先键索引排序
- 高位优先建索引排序
- 归并排序(java自带的排序算法),速度还行,关键是保持循环情况下的顺序稳定
低位优先:
public static void sort(string[] a, int w) { int n = a.length; int r = 256; // extend ascii alphabet size string[] aux = new string[n]; for (int d = w-1; d >= 0; d--) { int[] count = new int[r+1]; for (int i = 0; i < n; i++) count[a[i].charat(d) + 1]++; for (int r = 0; r < r; r++) count[r+1] += count[r]; for (int i = 0; i < n; i++) aux[count[a[i].charat(d)]++] = a[i]; for (int i = 0; i < n; i++) a[i] = aux[i]; } }
高位优先:https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/msd.java.html
java自带排序:
arrays.sort(arr);
冒泡:
public static void bubblingsort(string[] arr) { int size = arr.length; for(int i = 0; i<size-1; i++) { for (int j = i+1; j<arr.length; j++) { if(arr[i].compareto(arr[j])>0) { string temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } }
快速:
static void quicksort(string[] arr,int left,int right) //快速排序算法 { string f,t; int rtemp,ltemp; ltemp=left; rtemp=right; f=arr[(left+right)/2]; //分界值 while(ltemp<rtemp) { while(arr[ltemp].compareto(f)<0) { ++ltemp; } while(arr[rtemp].compareto(f)>0) { --rtemp; } if(ltemp<=rtemp) { t=arr[ltemp]; arr[ltemp]=arr[rtemp]; arr[rtemp]=t; --rtemp; ++ltemp; } } if(ltemp==rtemp) { ltemp++; } if(left<rtemp) { quicksort(arr,left,ltemp-1); //递归调用 } if(ltemp<right) { quicksort(arr,rtemp+1,right); //递归调用 } }
三向快速:
https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/quick3string.java.html
验证代码:
public static void main(string[] args) { url path = sortwords.class.getresource(""); //不定长随机单词1000个 //file file = new file(path.getpath()+"/1000words.txt"); //长度为5的单词,5757个 file file = new file(path.getpath()+"/words5.txt"); file file1 = new file(path.getpath()+"/words5.txt"); file file2 = new file(path.getpath()+"/words5.txt"); file file3 = new file(path.getpath()+"/words5.txt"); file file4 = new file(path.getpath()+"/words5.txt"); file file5 = new file(path.getpath()+"/words5.txt"); string[] arr = (string[])readfiledata.txt2list(file).toarray(new string[0]); //排序前 for(string s : arr) { //system.out.println(s.tostring()); } //##############低位优先 timemillis.setstart(); lsd.sort(arr,5); timemillis.setend("低位优先键索引排序:"); //排序后 for(string s : arr) { //system.out.println(s.tostring()); } //##############高位优先 string[] arr1 = (string[])readfiledata.txt2list(file1).toarray(new string[0]); timemillis.setstart(); msd.sort(arr1); timemillis.setend("高位优先键索引排序:"); //排序后 for(string s : arr1) { //system.out.println(s.tostring()); } //##############java自带排序 string[] arr2 = (string[])readfiledata.txt2list(file2).toarray(new string[0]); timemillis.setstart(); arrays.sort(arr2); timemillis.setend("java自带排序:"); //排序后 for(object s : arr2) { //system.out.println(s.tostring()); } //##############冒泡排序 string[] arr3 = (string[])readfiledata.txt2list(file3).toarray(new string[0]); timemillis.setstart(); bubblingsort(arr3); timemillis.setend("冒泡排序:"); //排序后 for(string s : arr3) { //system.out.println(s.tostring()); } //##############快速排序 string[] arr4 = (string[])readfiledata.txt2list(file4).toarray(new string[0]); timemillis.setstart(); quicksort(arr4,0,5756); timemillis.setend("快速排序:"); //排序后 for(string s : arr4) { //system.out.println(s.tostring()); } //##############三向快速排序 string[] arr5 = (string[])readfiledata.txt2list(file5).toarray(new string[0]); timemillis.setstart(); quick3string.sort(arr5); timemillis.setend("三向快速排序:"); //排序后 for(string s : arr5) { //system.out.println(s.tostring()); } }
运行多次结果相近:
低位优先键索引排序:8 ms
高位优先键索引排序:10 ms
java自带排序:15 ms
冒泡排序:315 ms
快速排序:9 ms
三向快速排序:13 ms
用到的数据txt文件下载:
readfiledata帮助类:
import java.io.bufferedreader; import java.io.file; import java.io.filereader; import java.util.arraylist; import java.util.list; public class readfiledata { public static string txt2string(file file){ stringbuilder result = new stringbuilder(); try{ bufferedreader br = new bufferedreader(new filereader(file)); string s = null; while((s = br.readline())!=null){ result.append(system.lineseparator()+s); } br.close(); }catch(exception e){ e.printstacktrace(); } return result.tostring(); } public static list<string> txt2list(file file){ try{ bufferedreader br = new bufferedreader(new filereader(file)); list<string> list = new arraylist<string>(); string s; while((s = br.readline())!=null){ list.add(s); } br.close(); return list; }catch(exception e){ e.printstacktrace(); } return null; } public static object[] txt2array(file file){ return txt2list(file).toarray(); } }
参考书目:《算法 4th》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。