快速排序以及找到第k小的元素

2021-07-22 22:22:58 字數 987 閱讀 5671

快速排序使用分治的思想,對子陣列a[p..r]進行快速排序,分3步:

1. 分解:將陣列a[p..r]劃分成兩個子陣列a[p ..q-1]和a[ q+1,..,r],使得a[p ..q-1]中的每乙個元素均小於等於a[q],

a[ q+1,..,r]中的每個元素均大於等於a[q]。

2. 解決:對子陣列a[p,..,q-1]和a[q+1,..,r]進行排序

3. 合併:因為快速排序是原址排序,所以不需要合併操作。

快速排序的執行時間依賴於劃分是否平衡,所以這裡的排序基於隨機抽樣,random_partition隨機選乙個元素做主元。

// quick_sort.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include

#include

#include

using namespace std;

void show(int i)

//p指向陣列a的最左端,r指向最右端

int partition(vector

& a,int p,int r) void quick_sort(vector

& a, int p, int r)

//p指向陣列a的最左端,r指向最右端

int partition(vector

& a,int p,int r) //返回陣列a[p..r]中第i小的元素 int randomized_selsect(vector

& a,int p,int r,int i) void quick_sort(vector

& a, int p, int r) { int q; if(p

v(8); for(int i=0;i<8;i++) v[i]=a[i]; for_each(v.begin(),v.end(),show); cout<

求第k小元素的快速排序演算法

name 第k小元素 author date 13 04 17 15 28 description 求一列數中的第k小元素,利用分治的策略進行遞迴求解。模仿快速排序法的思路,只不過每次只遞迴處理第k小元素所在的序列。使用消除尾遞迴優化後效果更好。include include include inc...

快速排序 第K大 第K小的問題

這裡的快排 是一種稍微改進的快排,即減少一些不必要的交換次數。quick sort void quick sort int s,int e a s a i 此時 i j 為最後找到的最小的數,需要放在樞軸處 即位置s a i x quick sort s,i 1 quick sort i 1,e 第...

快速排序(求第k小的數)

快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...