快速排序及查找第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)題。
                            
                        - 上一篇: 接口自动化框架概述(一)
 - 下一篇: pdo mysql like_PHP P