八大排序演算法之快速排序(二)

2021-08-26 03:04:58 字數 2195 閱讀 5848

public static void kuaisu(int arr,int low,int high) 

if(j>i)

while(j>i && arr[i]i)

arr[i]=x;

kuaisu(arr,i+1,high);

kuaisu(arr,low,i-1);}

}public static void main(string args) ;

int arr3=;

int arr2=;

kuaisu(arr3, 0, arr3.length-1);

for(int s:arr3)

}

快速排序的基本思想是

1、先從數列中取出乙個數作為基準數

2、分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊

3、再對左右區間重複第二步,直到各區間只有乙個數

概括來說為挖坑填數+分治法

下面舉例來進行說明,主要有三個引數,i為區間的開始位址,j為區間的結束位址,x為當前的開始的值

第一步,i=0,j=9,x=2101

2345

6789

2132

4398

5445234

6686

第二步,從j開始由,後向前找,找到比x小的第乙個數a[7]=4,此時i=0,j=6,x=21 

進行替換01

2345

6789

4324398

5445

232166

86第三步,由前往後找,找到比x大的第乙個數a[1]=32,此時i=2,j=6,x=2101

2345

6789

42143

9854

4523

3266

86第四步,從j=6開始由,由後向前找,找到比x小的第乙個數a[0]=4,此時i=2,j=0,x=21,發現j<=i,所以第一回結束

可以發現21前面的數字都比21小,後面的數字都比21大 

接下來對兩個子區間[0,0]和[2,9]重複上面的操作即可

下面直接給出過程,就步詳細解說了

i=2,j=6,x=4301

2345

6789

4214398

5445

233266

86i=4,j=6,x=4301

2345

6789

421329854

4523

4366

86i=4,j=5,x=4301

2345

6789

421324354

452398

6686

i=5,j=5,x=4301

2345

6789

4213223

4345

5498

6686

然後被分為了兩個子區間[2,3]和[5,9]

….最後排序下去就是最終的答案01

2345

6789

4212332

4345

5466

8698

總結:

1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。

2.j–由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。

3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。

4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

快速排序:平均時間複雜度log2(n)*n,所有內部排序方法中最高好的,大多數情況下總是最好的。

快速排序是不穩定的。

穩定性簡單來說就是:

如果a i == a j,ai 原來在 aj 位置前,排序後 ai  仍然是在 aj 位置前,這樣就是穩定的。

八大排序之快速排序

快速排序 public class quicksort int arr 測試時間複雜度 o n 2 int arr new int 80000 for int i 0 i arr.length i long start time system.currenttimemillis quicksort ...

八大排序之快速排序

思想 定義陣列中的第乙個數為標誌量,再定義兩個指標,乙個指標從右向左開始遍歷陣列,直到找到乙個數比標誌量小 另乙個指標再從左向右遍歷陣列,直到找到乙個數比標誌量大。若找到,則交換這兩個數的位置,然後重複上述過程。直到兩個指標相遇時,交換此時指標指向的數的位置與標誌量的位置。此時,標誌量左邊的數均小於...

八大排序演算法1 快速排序

1.原理介紹 假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數,為了方便,就讓第乙個數6作為基準數吧。接下來,需要將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊,類似下面這種排列 3 1 2 5 4 6 9...