快速排序法為什麼一定要從右邊開始
while(arr[j]>=temp&&i<j){
j--;
}
while(arr[i]<=temp&&i<j){
i++;
}
這裡兩個while的順序是不能改變的,想一想:
假設對如下進行排序:
如上圖,6在左,9在右 我們將6作為基數。
假設從左邊開始(與正確程式正好相反)
於是i 就會移動到現在的 數字 7 那個位置停下來,而 j 原來在 數字 9 那個位置 ,因為
while(arr[j]>=temp&&i<j)
於是,j 也會停留在數字7 那個位置,於是問題來了。當你最後交換基數6與7時,不對呀!!。
問題在於當我們先從在邊開始時,那麼 i 所停留的那個位置肯定是大於基數6的,而在上述例子中,為了滿足 i<j 於是 j也停留在7的位置
但最後交換回去的時候,7就到了左邊,不行,因為我們原本 交換後數字6在邊應該是全部小於6,右邊全部大於6.但現在不行了。
於是,我們必須從右邊開始,也就是從基數的對面開始。
相關推薦
快速排序法為什麼一定要從右邊開始
while(arr[j]>=temp&&i<j){ j--; } while(arr[i]<=temp&&i<j){ i++; } 這裡兩個while的順序是不能改變的,想一想: 假設對如下進行排
快排為什麼一定要重右邊開始?
今天剛好同事問了下,為什麼以前背的快排一定要從右邊開始?剛好也順便給大家做個總結。 其實快排沒有一定要重右邊開始,只是看你基數的位置,如果你基數選的是最左邊的。你一定要確保,你交換基礎的時候,保證那個數要小於基數。但是你重右邊開始,就無法保證了。 比如你有
快速排序法
ron 它的 jet amp uek cnblogs 方法 ++ 部分 這個排序方法的時間復雜度為O(nlogn),最壞時間復雜度為O(n^2),所以說是屬於所有排序方法中比較高效率的一種了。 這種排序方法的基本思想是: 先找到一個區間中的一個基準點,然後找到這個區間
C語言實現快速排序法(分治法)
下一個 enter hang partition 等於 就是 tor log markdown title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true ---
Java常用的八種排序演算法與程式碼實現(二):歸併排序法、快速排序法
注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort): 分而治之,遞迴實現 如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了 歸併排序是穩定的排序演算法,時間
php四種基礎演算法:冒泡,選擇,插入和快速排序法 程式碼練習
function maopao($arr,$len) { for($i=1;$i<$len;$i++) { for($j=0;$j<$len-$i;$j++) { if($arr[$j]>$arr[$j+1])
快速排序法 拉格朗日插值法 二分法
快速排序法(泛型) static void Main(string[] args) { Console.WriteLine("請輸入待排序數列(以\",\"分割):"); string _s = Console.ReadLine(); string[] _
Java 實現快速排序法對陣列進行排序
快速排序是對氣泡排序的一種改進,其排序速度相對較快。 基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料要小,然後再按照這個方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列的目的。最壞情況的
快速排序法(一)
https ffffff roc 技術分享 快速 nag 習慣 ado follow 由於作者不習慣該編輯器,只是貼出上本文的截圖,詳見:https://www.yuque.com/docs/share/33cb075a-ce6e-45f3-8de0-0ea0f749d1
快速排序法(二)
term log -o mar 技術 href ges ima process 由於作者不習慣該編輯器,只是貼出上本文的截圖,詳見:https://www.yuque.com/docs/share/3592da47-f9a5-4837-b2f6-1b553fcd8e3e快
快速排序法 Java實現
快速排序法又叫二分法排序: import java.util.Random; public class Quicksort { public static void main(String
快速排序法(golang實現)
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n
C#快速排序法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 排序法
快速排序法-Java實現
public static void quickSort(int[] a, int left, int right) { int f, t; int rtemp, ltemp; ltemp = left; rtemp = right; f = a[(left + right)
C#面試題:快速排序法
快速排序法:找到一個基準點key,和left,right,比較,比key小的值放到key的坐邊,比key大的值,放到key的右邊。 採用遞迴方式,重複執行判斷,直到排序完成。 //快速排序法法 //排序找出基準點。 private static int
Acient Cipher 古老的密碼 快速排序法
UVa1339(古老的密碼) 題目:古老的密碼 題目描述: 給定兩個長度一樣且不超過100的字串,判斷是否能把其中一個字串的各個字母重排,之後對26個字母做一個一一對映,使得兩個字串相同 例如,JWPUDJSTVP重排後可以得到WJDUPSJPVT,之後把每個字母對映到
以一邊為基數的快速排序法
看寫法二吧,寫法一將方法抽離出來,卻降低了效率。 寫法一(經實測,資料量大時,容易會溢位。) private void quickSort3(int[] arr, int left, int right) { if(left<right){ int middle = g
學過的演算法中最快捷——快速排序法
<strong style="font-size:24px;"> </strong><span style="font-size:14px;">/// <summary> /// 快速排序法 /// </summary>
氣泡排序法、選擇排序法、快速排序法三者的效率對比,包括陣列的儲存與載入
排序演算法: // 冒泡 void sorta(int array[], int n) { for (int i = 0; i < n; i++) { for (int t = i + 1; t < n; t++) { if (array[
《啊哈演算法》裡快排要從右開始的原因
書上的例子是從右開始的,還強調了幾次必須。為什麼一定要從右邊開始呢?讓我們來試試從左邊開始會怎樣~還是用了書上的例子:不過我們是從 i 向右走開始前面幾步的 i , j 換位沒出現什麼問題,圖片就不放出