无序数组中用 快速排序的分治思想 寻找第k大元素

#include <stdio.h>

int *ga;
int galen;
void print_a(){
    for(int i = 0; i < galen; i++){
        printf("%d ",ga[i]);
    }
    printf("
");
}

//k = di k da yuan su
int quick_findk(int *a, int len, int k){
    if(len <= 1)
        return a[0];
    int *p,*l,*r,tmp;
    p=&a[len-1];
    l=a;
    r=&a[len-2];
    while(l < p){
        printf("len:%d , k:%d
",len,k);
        print_a();
        while(*l<*p && l!=p)
            l++;
        while(*r>*p && r>l)
            r--;

        if(l != r && l < r){
            tmp = *l;
            (*l) = (*r);
            *r = tmp;
        }else{
            tmp = *p;
            (*p) = (*l);
            *l = tmp;
            print_a();
            int index = l - a;
            printf("index:%d v:%d
",index,a[index]);
            if(index == len-k){
                return *l;
            }else if(index < len-k){//in right
                return quick_findk(&a[index+1],len-index-1,k);
            }else if(index > len-k){//in left
                return quick_findk(a,index,k-(len - index));
            }
        }
    }
}


void main(){
    int a[] = {6,1,4,3,5,2};
    int len = sizeof(a) / sizeof(a[0]);
    ga = a;
    galen = len;
    int r = quick_findk(a, len, 4); //3
    printf("%d 
",r);
}
root@ubuntu:~/cdir# gcc quicksort_findk.c -o quicksort_findk.bin -g
root@ubuntu:~/cdir# ./quicksort_findk.bin 
len:6 , k:4
6 1 4 3 5 2 
len:6 , k:4
1 6 4 3 5 2 
1 2 4 3 5 6 
index:1 v:2
len:4 , k:4
1 2 4 3 5 6 
1 2 4 3 5 6 
index:3 v:6
len:3 , k:3
1 2 4 3 5 6 
1 2 4 3 5 6 
index:2 v:5
len:2 , k:2
1 2 4 3 5 6 
1 2 3 4 5 6 
index:0 v:3
3 

最后 = 3

原文地址:https://www.cnblogs.com/cyy12/p/11806707.html