減治法_計算第k小(遞迴)
阿新 • • 發佈:2019-01-29
【程式】
#include <stdio.h> #define N 100 void swap(int *p,int *q) //交換 { int t; t=*p; *p=*q; *q=t; } int Partition(int a[],int l,int r) //一趟排序返回基準 { int i,j,p; p=a[l]; i=l;j=r+1; while(i<j) { do{ i++; } while(p>a[i]); do{ j--; }while(p<a[j]); swap(&a[i],&a[j]); } swap(&a[i],&a[j]); swap(&a[l],&a[j]); return j; } int Quickselect(int a[],int l,int r,int k) { int s; s=Partition(a,l,r); //返回基準 if(k-1==s) return a[s]; else if(k-1<s) //在基準左邊 Quickselect(a,l,s-1,k); else Quickselect(a,s+1,r,k); //在基準右邊 } int main() { int a[N],i,n,k,m; printf("請輸入元素個數:"); scanf("%d",&n); printf("請輸入陣列元素:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("請輸入第k小的數:"); scanf("%d",&k); m=Quickselect(a,0,n-1,k); printf("%d\n",m); }