#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