欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實現(xiàn)6種字符串?dāng)?shù)組的排序(String array sort)

 更新時間:2020年01月14日 09:57:30   作者:昕友軟件開發(fā)  
這篇文章主要介紹了java實現(xiàn)6種字符串?dāng)?shù)組的排序(String array sort),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

注意,本文不是字符串排序,是字符串?dāng)?shù)組的排序。

方法分別是:

1、低位優(yōu)先鍵索引排序
2、高位優(yōu)先建索引排序
3、Java自帶排序(經(jīng)過調(diào)優(yōu)的歸并排序)
4、冒泡排序
5、快速排序
6、三向快速排序

時間復(fù)雜度:

  • 最慢的肯定是冒泡,O(n的平方)
  • 最快的是快速排序,平均 O(nlogn)
  • 低位優(yōu)先,O(nW),W是字符串長度,在字符串長度較短情況下和快速排序時間應(yīng)該很接近
  • 高位優(yōu)先,O(n) - O(nW)
  • 三向快速排序,O(n) - O(nW)

本文中使用的例子是一個5757行的隨機字符串?dāng)?shù)組文本TXT,實際測試結(jié)果:

  • 低位優(yōu)先鍵索引排序:5 ms
  • 高位優(yōu)先鍵索引排序:8 ms
  • JAVA自帶排序:9 ms
  • 冒泡排序:284 ms
  • 快速排序:8 ms
  • 三向快速排序:12 ms

穩(wěn)定的排序是:

  • 低位優(yōu)先鍵索引排序
  • 高位優(yōu)先建索引排序
  • 歸并排序(Java自帶的排序算法),速度還行,關(guān)鍵是保持循環(huán)情況下的順序穩(wěn)定

低位優(yōu)先:

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];
    }
  }

高位優(yōu)先: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);      //遞歸調(diào)用
    }
    if(ltemp<right) 
    {
      quickSort(arr,rtemp+1,right);      //遞歸調(diào)用
    }
  }

三向快速:

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());
    }
    
    //##############低位優(yōu)先
    TimeMillis.setStart();
    LSD.sort(arr,5);
    TimeMillis.setEnd("低位優(yōu)先鍵索引排序:");
    //排序后
    for(String s : arr) {
      //System.out.println(s.toString());
    }
    
    //##############高位優(yōu)先
    String[] arr1 = (String[])ReadFiledata.txt2List(file1).toArray(new String[0]);
    TimeMillis.setStart();
    MSD.sort(arr1);
    TimeMillis.setEnd("高位優(yōu)先鍵索引排序:");
    //排序后
    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());
    } 
  }

運行多次結(jié)果相近:

低位優(yōu)先鍵索引排序:8 ms
高位優(yōu)先鍵索引排序:10 ms
JAVA自帶排序:15 ms
冒泡排序:315 ms
快速排序:9 ms
三向快速排序:13 ms

 用到的數(shù)據(jù)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》

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中this關(guān)鍵字的詳細(xì)使用介紹

    java中this關(guān)鍵字的詳細(xì)使用介紹

    大家好,本篇文章主要講的是java中this關(guān)鍵字的詳細(xì)使用介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java 之類型轉(zhuǎn)換與多態(tài)詳情

    Java使用類創(chuàng)造新的類型(type),并使用繼承來便利我們創(chuàng)建類。再深一層講類型,并是多態(tài)(polymorphism)的概念。本文將給大家介紹Java 的類型轉(zhuǎn)換與多態(tài),需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • 基于Java實現(xiàn)的一層簡單人工神經(jīng)網(wǎng)絡(luò)算法示例

    基于Java實現(xiàn)的一層簡單人工神經(jīng)網(wǎng)絡(luò)算法示例

    這篇文章主要介紹了基于Java實現(xiàn)的一層簡單人工神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實例形式分析了java實現(xiàn)人工神經(jīng)網(wǎng)絡(luò)的具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • java中單雙斜杠的使用圖文詳解

    java中單雙斜杠的使用圖文詳解

    JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,下面這篇文章主要給大家介紹了關(guān)于java中單雙斜杠使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • java高并發(fā)之線程的基本操作詳解

    java高并發(fā)之線程的基本操作詳解

    本文主要介紹java高并發(fā)線程的基本操作,這里整理詳細(xì)的資料來解釋線程的知識,有需要的學(xué)習(xí)高并發(fā)的朋友可以參考下
    2021-10-10
  • IDEA自動生成類圖和時序圖的操作指南

    IDEA自動生成類圖和時序圖的操作指南

    idea 的強大之處在于此,它包含了很多小插件,我們不需要再次下載相關(guān)插件,只需要在idea中小小的設(shè)置一下就可以了,本文我介紹了IDEA自動生成類圖和時序圖的操作指南,我用的是idea2020版本,需要的朋友可以參考下
    2024-05-05
  • Java中的OkHttp使用教程

    Java中的OkHttp使用教程

    OkHttp是目前非?;鸬木W(wǎng)絡(luò)庫,OKHttp與HttpClient類似,也是一個Http客戶端,提供了對?HTTP/2?和?SPDY?的支持,并提供了連接池,GZIP?壓縮和?HTTP?響應(yīng)緩存功能,本文重點給大家介紹Java?OkHttp使用,感興趣的朋友一起看看吧
    2022-04-04
  • Javaweb使用cors完成跨域ajax數(shù)據(jù)交互

    Javaweb使用cors完成跨域ajax數(shù)據(jù)交互

    本文由跨域、cors的概念開始,進而向大家介紹了Javaweb使用cors完成跨域ajax數(shù)據(jù)交互的相關(guān)內(nèi)容,需要的朋友可以了解下。
    2017-09-09
  • Python連接Java Socket服務(wù)端的實現(xiàn)方法

    Python連接Java Socket服務(wù)端的實現(xiàn)方法

    這篇文章主要介紹了Python連接Java Socket服務(wù)端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找

    劍指Offer之Java算法習(xí)題精講二叉搜索樹與數(shù)組查找

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03

最新評論