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

Java經(jīng)典快排思想以及快排的改進(jìn)講解

 更新時間:2019年01月04日 08:33:16   作者:sdr_zd  
今天小編就為大家分享一篇關(guān)于Java經(jīng)典快排思想以及快排的改進(jìn)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一.經(jīng)典快排思想

前提條件:給定一個無序數(shù)組arr

  1. 取這個數(shù)組最后一個數(shù) num 作為標(biāo)準(zhǔn),將前面部分的數(shù)分為兩部分,使得<=num的部分在左邊,>num的數(shù)在右邊;
  2. 然后將最后一個數(shù)和>num部分的第一個數(shù)進(jìn)行交換,就使得原本在數(shù)組最后位置的num找到了正確的位置,它的左邊都是比它小的以及和它一樣的數(shù),右邊都是比它大的數(shù)
  3. 回到1,進(jìn)行遞歸或迭代,使得所有的數(shù)都找到正確的位

二.通過荷蘭國旗問題改進(jìn)快排

什么是荷蘭國旗問題?

已知一個整形數(shù)組arr,和一個整數(shù)num,請把小于num的數(shù)放在數(shù)組的左邊,等于num的數(shù)放在數(shù)組的中間,大于num的數(shù)放在數(shù)組的右邊。

解決思路:

遍歷數(shù)組

  • 1. 若比num小,當(dāng)前位置和小于的最后一個位置+1的值交換,并當(dāng)前位置++;
  • 2. 若比num大,當(dāng)前位置和大于的第一個位置-1的值交換;
  • 3. 若等于num的值,當(dāng)前位置++;

附上代碼:

public static void NetherlandsFlag(int[] arr, int L, int R, int num) {
 int i = L;
 int p1 = L-1;
 int p2 = R+1;
 //終止條件:當(dāng)前數(shù)的位置在大于區(qū)的前一個
 while(i < p2) {
  if(arr[i] < num) {
   //當(dāng)前數(shù)比num小,放左邊,i位置上的數(shù)和L上的數(shù)進(jìn)行交換,并且i++,L++
   swap(arr, i++, ++p1);
  } else if(arr[i] == num) {
   //當(dāng)前數(shù)和num相等,i++
   i++;
  } else {
   //當(dāng)前數(shù)比num大,放右邊,i位置上的數(shù)和R上的數(shù)進(jìn)行交換,并且i++,R--
   swap(arr, i, --p2);
  }
 }
}

我們可以發(fā)現(xiàn),荷蘭國旗問題和經(jīng)典快排不同的就只是將<=num改為了< num和=num兩部分,借用這個思想使得原來每次只可以讓一個數(shù)找到正確的位置改進(jìn)為了每次至少讓一個數(shù)找到位置。

三.在這基礎(chǔ)上將其改為隨機(jī)快排

隨機(jī)快排改進(jìn)的地方只是在選取數(shù)的時候,將每次都選取最后位置的數(shù)改為選取隨機(jī)的一個數(shù)作為num,這樣做的好處是什么呢?

1.選取最后一個數(shù):如果是一個已經(jīng)排好序的數(shù)組,每次找到位置之后,左邊是要進(jìn)行排序的部分,數(shù)組長度是原長度-1,它的時間復(fù)雜度就是O(N^2);如果每次找到的數(shù)都是中間的位置,它的時間復(fù)雜度就只有O(logN)

2.然而以隨機(jī)數(shù)作為選取的標(biāo)準(zhǔn)num的時候,因為是隨機(jī)的,就只能通過數(shù)學(xué)期望去計算它的時間復(fù)雜度,時間復(fù)雜度是O(logN)

下面附上最終的快排代碼及注釋

/*
 * swap(int[] arr, int i, int j);是將arr數(shù)組的i和j位置上的數(shù)交換的方法
 */
public static void quickSort(int[] arr) {
 // 如果為空或長度為1不需要排序,直接返回
 if(arr == null || arr.length < 2)
  return;
 else
  quickSort(arr, 0, arr.length - 1);
}
// 遞歸排序
public static void quickSort(int[] arr, int L, int R) {
 if(L < R) {
  /*
   * 隨機(jī)快排的隨機(jī)就在這
   * 是隨機(jī)選取了一個數(shù),和 R 進(jìn)行了交換,然后使用這個數(shù)作為num,
   * 所以每次選取的num是隨機(jī)的,
   * 在計算時間復(fù)雜度時,是沒有最優(yōu)最差情況的
   * 而是通過一個長期的數(shù)學(xué)期望計算的,結(jié)果是O(N*logN)
   */
  swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
  int[] border = partition(arr, L, R);
  // 小于區(qū)和大于區(qū)進(jìn)行遞歸
  quickSort(arr, L, border[0] - 1);
  quickSort(arr, border[1] + 1, R);
 }
}
// 將給定數(shù)組劃分為小于區(qū)、等于區(qū)和大于區(qū)
public static int[] partition(int[] arr, int L, int R) {
 int num = arr[R];
 int less = L - 1;
 int more = R + 1;
 int curr = L;
 // 分為小于區(qū)等于區(qū)和大于區(qū)
 while(curr < more) {
  if(arr[curr] < num) {
   swap(arr, curr++, ++less);
  } else if(arr[curr] > num) {
   swap(arr, curr, --more);
  } else {
   curr++;
  }
 }
 //返回等于區(qū)的左右邊界的下標(biāo),通過下標(biāo)確定小于區(qū)和大于區(qū)遞歸時的參數(shù)
 return new int[] {less + 1, more - 1};
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • Java中的位運算符全解

    Java中的位運算符全解

    這篇文章主要為大家詳細(xì)介紹了Java中的位運算符,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 淺析Java?ReentrantLock鎖的原理與使用

    淺析Java?ReentrantLock鎖的原理與使用

    這篇文章主要為大家詳細(xì)介紹了Java中ReentrantLock鎖的原理與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2023-08-08
  • 使用java實現(xiàn)云端資源共享小程序的代碼

    使用java實現(xiàn)云端資源共享小程序的代碼

    這篇文章主要介紹了用java寫一個云端資源共享小程序,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot項目打包war包時無法運行問題的解決方式

    SpringBoot項目打包war包時無法運行問題的解決方式

    在開發(fā)工程中,使用啟動類啟動能夠正常啟動并測試,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目打包war包時無法運行問題的解決方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 基于java實現(xiàn)websocket協(xié)議過程詳解

    基于java實現(xiàn)websocket協(xié)議過程詳解

    這篇文章主要介紹了基于java實現(xiàn)websocket協(xié)議過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java讀取excel文件的兩種方法

    java讀取excel文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了java讀取excel文件的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java并發(fā)包之CopyOnWriteArrayList類的深入講解

    Java并發(fā)包之CopyOnWriteArrayList類的深入講解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)包之CopyOnWriteArrayList類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Springboot如何切換默認(rèn)的Tomcat容器

    Springboot如何切換默認(rèn)的Tomcat容器

    這篇文章主要介紹了Springboot如何切換默認(rèn)的Tomcat容器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • spring-boot-starter-validation?校驗參數(shù)的實現(xiàn)

    spring-boot-starter-validation?校驗參數(shù)的實現(xiàn)

    參數(shù)校驗在很多地方都可以用到,本文主要介紹了spring-boot-starter-validation?校驗參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java開發(fā)利器之Guava?Cache的使用教程

    Java開發(fā)利器之Guava?Cache的使用教程

    緩存技術(shù)被認(rèn)為是減輕服務(wù)器負(fù)載、降低網(wǎng)絡(luò)擁塞、增強Web可擴(kuò)展性的有效途徑之一。今天咱們就來聊聊Guava?Cache本地緩存,感興趣的可以了解一下
    2022-09-09

最新評論