從陣列中找到第k小元素
阿新 • • 發佈:2019-01-07
#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 )); }