快速排序及查找第K个大的数。
生活随笔
收集整理的這篇文章主要介紹了
快速排序及查找第K个大的数。
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文提供了一種基于分治法思想的,查找第K個(gè)大的數(shù),可以使得時(shí)間復(fù)雜地低于nlogn. 因?yàn)榭炫诺钠骄鶗r(shí)間復(fù)雜度為nlogn,但是快排是全部序列的排序,
本文查找第k大的數(shù),則不必對(duì)整個(gè)序列進(jìn)行排序。請(qǐng)看本文:
說(shuō)明本文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出自:豐澤園的天空-快速排序及查找第K個(gè)大的數(shù)
1 #include<stdio.h>
2 #include<stdlib.h>
3 /* 如何查找第k小的數(shù),或者第k大的數(shù)*/
4 partition(int data[],size_t left ,size_t right)
5 {
6 int i = left;
7 int j = right;
8 int p = (left + right) / 2;
9 int pivot = data[p];
10 while(i < j){
11 for(; i < p && data[i] <= pivot;++i);
12 if(i < p) {
13 data[p] = data[i];
14 p = i;
15 }
16 for(; j > p && data[j] >= pivot; --j);
17 if( j > p){
18 data[p] = data[j];
19 p = j;
20 }
21 }
22 data[p] = pivot;
23 return p;
24
25 }
26 int quick_sort(int data[],size_t left, size_t right)
27 {
28 if(left < right){
29 int index = partition(data,left,right);
30 if(index - left > 1 )
31 quick_sort(data,left, index-1);
32 if(right - index > 1)
33 quick_sort(data,index + 1, right);
34
35 }
36
37 }
38 int findK(int data[], size_t left, size_t right, size_t k){
39 if(left < right){
40 int mid = partition(data,left, right);
41 if(mid - left + 1 >= k)
42 findK(data,left, mid, k );
43 else
44 findK(data, mid + 1, right, k- (mid - left +1));
45 }
46
47 }
48 int main()
49 {
50 int data[] = {12,2,1 ,0 ,4,11,-1, 9 ,6};
51 int len = sizeof(data)/sizeof(data[0]);
52 // quick_sort(data,0,len - 1);
53 int i =0;
54 /* 打印原始序列 */
55 for( i = 0; i < len ; ++i)
56 {
57 printf(" %d ",data[i]);
58 }
59 findK(data,0,len - 1, 5);
60 printf("x = %d
", data[5] );
61 /* 找到第k個(gè)大的數(shù)后,序列的變化為:---快排之前*/
62 for( i = 0; i < len ; ++i)
63 {
64 printf(" %d ",data[i]);
65 }
66 printf("
");
67 /* 快排之后的序列*/
68 quick_sort(data,0,len - 1);
69 for( i = 0; i < len ; ++i)
70 {
71 printf(" %d ",data[i]);
72 }
73 printf("
");
74
75 }
說(shuō)明:查找第K個(gè)大的數(shù),用到是分治法的思想。聯(lián)想到快排中,完成一次排序,左邊的序列比基準(zhǔn)值小,右邊的序列比基準(zhǔn)值大,只要確定第k個(gè)大數(shù)在哪個(gè)序列中,只要對(duì)這個(gè)子序列進(jìn)行排序即可。
總結(jié)
以上是生活随笔為你收集整理的快速排序及查找第K个大的数。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 接口自动化框架概述(一)
- 下一篇: Delphi TRect函数例子