1. 程式人生 > >從陣列中找到第k小元素

從陣列中找到第k小元素

#include <stdio.h>
#include <stdlib.h>

int Element_k( int data[] , int key ,int low , int high ){
    //基於快排的思想,如果pivot=data[low], low=k 那麼pivot就是第k小的元素
    int pivot = data[low] ;
    int low_temp = low ;
    int high_temp = high ;                            //使用temp標記當前位置,以便找到遞迴的頭和尾
    while( low < high ){
        while(low < high && pivot <= data[high]) --high;
        data[low] = data[high] ;
        while(low < high && pivot >= data[low]) ++low;
        data[high] = data[low] ;
    }
    data[low] = pivot ;
    //以上是快速排序的劃分
    if( low==key ) return data[low];
    else if( low>key )
        return Element_k( data , key , low_temp , low-1 );
    else                                               //第k小的元素在pivot的左邊,那麼遞迴就變成查詢第k-low小的元素
        return Element_k( data , key-low , low+1 , high_temp );
}
int main(){
    int data[50] , n  , key ;
    printf("輸入節點個數:\n");
    scanf("%d",&n);
    printf("輸入陣列:\n");
    for(int i = 0 ; i < n ; i++){
        scanf("%d",&data[i]);
    }
    printf("查詢第k小的元素:\n");
    scanf("%d" , &key);
    printf("%d",Element_k( data , key , 0 , n-1 ));

}