快速排序及查找第K個大的數。


本文提供了一種基於分治法思想的,查找第K個大的數,可以使得時間復雜地低於nlogn. 因為快排的平均時間復雜度為nlogn,但是快排是全部序列的排序,

本文查找第k大的數,則不必對整個序列進行排序。請看本文:

說明本文為原創文章,轉載請注明出自:豐澤園的天空-快速排序及查找第K個大的數

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 /* 如何查找第k小的數,或者第k大的數*/
 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\n", data[5] );
61    /* 找到第k個大的數后,序列的變化為:---快排之前*/
62     for( i = 0; i < len ; ++i)
63     {
64         printf(" %d ",data[i]);
65     }
66     printf("\n");
67   /* 快排之后的序列*/
68     quick_sort(data,0,len - 1);
69     for( i = 0; i < len ; ++i)
70     {
71         printf(" %d ",data[i]);
72     }
73     printf("\n");
74 
75 }

說明:查找第K個大的數,用到是分治法的思想。聯想到快排中,完成一次排序,左邊的序列比基准值小,右邊的序列比基准值大,只要確定第k個大數在哪個序列中,只要對這個子序列進行排序即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM