使用快速排序進行查詢,類似於二分查詢的意思,因為每次都會有乙個元素找到適當位置,該位置就是這個元素在陣列中的排列順序。每次partition會返回乙個陣列下標,將該陣列下標的元素和待查詢的值進行比較,如果相等,直接返回,如果大於,取partition操作後的右一側,反之,取左一側。
利用快速排序進行查詢,類似與二分查詢思想,其運算元為
n+n/2+n/4+.....,由此可見,其時間複雜度為o(n)
3 實現
/**
* 求陣列中第k小的元素
* 快速排序
* 時間複雜度為o(n)
*@author xld
* */
public
class
selection
public
static
intsolve(int arr, int l, int r, int k)
public
static
intpartition(int arr, int l, int r)
}swap(arr, l, j);
return j;
}private
static
void
swap(int arr, int i, int j)
// 測試insertionsort
public
static
void
main(string args) ;
int ret = selection.solve(arr, 3);
for (int i = 0; i < arr.length; i++)
system.out.println();
system.out.println("第k小的元素為:"+ret);
}}
快速排序的衍生問題之求陣列中第n大元素
還不了解快速排序的柚子,請參考我的這篇部落格 聊聊時間複雜度為o nlogn 的快速排序 下 快速排序求陣列中第n大的元素 尋找arr陣列中第k小的元素,k從1開始索引,即最小元素是第1小元素,以此類推 template typename t t findn t arr,int n,int key ...
尋找陣列中第n大的元素
給定乙個陣列,找出該陣列中第n大的元素的值。其中,1 n length。例如,給定乙個陣列a 當n 1時,返回9。我拿到這個問題的地中思路就是先排序,然後通過位置索引相應的第n大的元素。我使用的是o nlog n 級別的排序演算法,所以這種方法的時間複雜度應該也是o nlog n 級別的。那這個問題...
最壞情況O N 求陣列中第K 大的元素。
求陣列中第k的元素的一般方法就是使用快速排序的劃分,partion seq,start,end p,如果p k 則ok。如果p k 則在start,p 1的區間裡找第k大的數,partion seq,start,p 1 否則partion seq,p 1,end 演算法的平均時間複雜度為o n 最壞...