快速排序的基本實現
快速排序演算法是一種基於交換的高效的排序演算法,它採用了分治法的思想:
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]前面。則這個排序演算法是穩定的!
快速排序 實現一:
1int 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
快速排序 實現方法二:
1void 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 template2void 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...