91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java實現6種字符串數組的排序(String array sort)

發布時間:2020-08-27 08:06:30 來源:腳本之家 閱讀:510 作者:昕友軟件開發 欄目:編程語言

注意,本文不是字符串排序,是字符串數組的排序。

方法分別是:

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文件下載:

words5_jb51.rar

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》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

门头沟区| 凤山县| 固阳县| 永城市| 凤城市| 成都市| 嘉荫县| 济宁市| 苍溪县| 靖远县| 于田县| 内黄县| 梅河口市| 阿拉善右旗| 小金县| 寿光市| 南开区| 理塘县| 佛教| 长汀县| 页游| 伊金霍洛旗| 旬阳县| 胶南市| 江川县| 昭苏县| 巴彦淖尔市| 博客| 舞阳县| 竹山县| 扶余县| 恩施市| 百色市| 沙洋县| 湖南省| 浦北县| 茂名市| 慈溪市| 鄂伦春自治旗| 龙海市| 鹰潭市|