001 快速排序(C 實現)

2022-05-09 02:57:10 字數 2533 閱讀 6245

快速排序的基本實現

快速排序演算法是一種基於交換的高效的排序演算法,它採用了分治法的思想:

1、從數列中取出乙個數作為基準數(樞軸,pivot)。 

2、將陣列進行劃分(partition),將比基準數大的元素都移至樞軸右邊,將小於等於基準數的元素都移至樞軸左邊。

3、再對左右的子區間重複第二步的劃分操作,直至每個子區間只有乙個元素。

快排最重要的一步就是劃分了。劃分的過程用通俗的語言講就是「挖坑」和「填坑」。

快速排序時間複雜度

快速排序的時間複雜度在最壞情況下是o(n2),平均的時間複雜度是o(n*lgn)。

這句話很好理解:假設被排序的數列中有n個數。遍歷一次的時間複雜度是o(n),需要遍歷多少次呢?至少lg(n+1)次,最多n次。

(01) 為什麼最少是lg(n+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(n+1)。

因此,快速排序的遍歷次數最少是lg(n+1)次。

(02) 為什麼最多是n次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是n。因此,快讀排序的遍歷次數最多是n次。

快速排序穩定性

快速排序是不穩定的演算法,它不滿足穩定演算法的定義。

演算法穩定性 -- 假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個排序演算法是穩定的!

快速排序 實現一:

1

int partition(int arr, int left, int right) //

找基準數 劃分213

while (arr[j] >temp )

1417

if (i 18 swap(arr[i++], arr[j--]);

19else i++;20}

21swap(arr[j], arr[left]);

22return

j;2324}

2526

void quick_sort(int arr, int left, int

right)

27

快速排序 實現方法二:

1

void quicksort(int array, int start, int

last)218

19while (i < j && temp >array[i])

20 i++;

21if (i 222627}

28//

把基準數放到i位置

29 array[i] =temp;

30//

遞迴方法

31 quicksort(array, start, i - 1

);32 quicksort(array, i + 1

, last);33}

34 }

快速排序 用c++函式模板實現

1 template2

void quicksort(t data, int first, int

last)318

swap(data[upper], data[first]);

19if (first < upper - 1

)20 quicksort(data, first, upper - 1

);21

if (upper + 1

22 quicksort(data, upper + 1

, last);23}

2425 template

26void quicksort(t data, int

n)27

快速排序  主函式測試**

#define _crt_secure_no_warnings#include 

#include

#include

#include

#include

using

namespace

std;

void printarray(int array, int

len)

cout

<}int main(void);

srand((unsigned

int)time(nullptr));

for (int i = 0; i < num; i++)

cout

<< "

排序前:

"

cout

<< "

排序後:

"

0, num - 1

); printarray(array, num);

return0;

}

排序 快速排序,C 實現

本文 的github位址 基本思想 快速排序 是對 氣泡排序 的改進。基本原理 基於分治法,在待排線性表中取乙個元素pivot作為樞軸值,通過一趟排序將待排線性表劃分為獨立的兩部分,第一部分的所有元素小於pivot,第二部分的所有元素大於等於pivot,pivot位於其最終位置。遞迴對兩個子表做快速...

快速排序 c 實現

快速排序思想 基於分治策略,對氣泡排序的一種改進。對於要排序的乙個序列,從中選一值進行排序,將其放入到正確的位置position。然後以position為界,對左右兩部分再做排序。直到劃分的長度為1。步驟 設有一待排序的序列 1.分別設定low hight指向序列的最左端 最右端 從序列中選乙個進行...

快速排序(C 實現)

include using namespace std void swap int a,int b int sort int begin,int end if beginwhile beginif begin return begin void quicksort int begin,int end...