一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java經典快排思想以及快排的改進講解

Java經典快排思想以及快排的改進講解

2021-06-26 14:01sdr_zd Java教程

今天小編就為大家分享一篇關于Java經典快排思想以及快排的改進講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一.經典快排思想

前提條件:給定一個無序數組arr

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

二.通過荷蘭國旗問題改進快排

什么是荷蘭國旗問題?

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

解決思路:

遍歷數組

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

附上代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void netherlandsflag(int[] arr, int l, int r, int num) {
 int i = l;
 int p1 = l-1;
 int p2 = r+1;
 //終止條件:當前數的位置在大于區的前一個
 while(i < p2) {
  if(arr[i] < num) {
   //當前數比num小,放左邊,i位置上的數和l上的數進行交換,并且i++,l++
   swap(arr, i++, ++p1);
  } else if(arr[i] == num) {
   //當前數和num相等,i++
   i++;
  } else {
   //當前數比num大,放右邊,i位置上的數和r上的數進行交換,并且i++,r--
   swap(arr, i, --p2);
  }
 }
}

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

三.在這基礎上將其改為隨機快排

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

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

2.然而以隨機數作為選取的標準num的時候,因為是隨機的,就只能通過數學期望去計算它的時間復雜度,時間復雜度是o(logn)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
 * swap(int[] arr, int i, int j);是將arr數組的i和j位置上的數交換的方法
 */
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) {
  /*
   * 隨機快排的隨機就在這
   * 是隨機選取了一個數,和 r 進行了交換,然后使用這個數作為num,
   * 所以每次選取的num是隨機的,
   * 在計算時間復雜度時,是沒有最優最差情況的
   * 而是通過一個長期的數學期望計算的,結果是o(n*logn)
   */
  swap(arr, l + (int) (math.random() * (r - l + 1)), r);
  int[] border = partition(arr, l, r);
  // 小于區和大于區進行遞歸
  quicksort(arr, l, border[0] - 1);
  quicksort(arr, border[1] + 1, r);
 }
}
// 將給定數組劃分為小于區、等于區和大于區
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;
 // 分為小于區等于區和大于區
 while(curr < more) {
  if(arr[curr] < num) {
   swap(arr, curr++, ++less);
  } else if(arr[curr] > num) {
   swap(arr, curr, --more);
  } else {
   curr++;
  }
 }
 //返回等于區的左右邊界的下標,通過下標確定小于區和大于區遞歸時的參數
 return new int[] {less + 1, more - 1};
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/sdr_zd/article/details/79425077

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品一久久香蕉国产线看播放 | 日老逼 | 欧美一级久久久久久久大片 | 亚洲2017久无码 | 好大好硬好深好爽gif图 | 国产福利视频一区二区微拍视频 | 狠狠色| k逼| 亚洲精品卡1卡二卡3卡四卡 | 女八把屁股扒开让男生添 | 女同69式互添在线观看免费 | 风间由美vec399 | 男人与禽交的方法 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 99久久精品国产一区二区 | 四虎影在线永久免费观看 | 亚洲国产精品久久久久久网站 | 爆操美女| 波多野给衣一区二区三区 | 国产拍拍拍 | 国产精品久久久久久久福利院 | caoporm碰最新免费公开视频 | 动漫美女3d被爆漫画 | 91拍拍| www.久久精品视频 | 视频免费视频观看网站 | 日本三级在丈面前被耍了 | 天天射天天舔 | 日本老妇乱子伦中文视频 | 亚洲国产天堂久久综合网站 | 九九精品99久久久香蕉 | 国产色在线观看 | 午夜理论电影在线观看亚洲 | 夫妻性生活免费在线观看 | 欧美贵妇videos办公室360 | 日本视频免费看 | 99re这里都是精品 | 精品视频 九九九 | av毛片免费看 | 国产成人福利色视频 | 99国产精品免费视频 |