注意边界条件:
快速排序递归中,避免死循环,进入无限递归quickSort函数,判断if i < j
寻找第K个小的数值,直接判断 if i < j的条件的话,会存在导致没法求出第k个值的情况。
分析无限递归的条件。 k==0 时会导致无限递归。
#include "stdio.h"
int part(int arr[],int i,int j)
{
int tmp =arr[i];
while(i<j)
{
while(i<j && arr[j] > tmp)
{
j--;
}
arr[i]=arr[j];
while(i<j && arr[i] < tmp)
{
i++;
}
arr[j]=arr[i];
}
arr[i]=tmp;
return i;
}
void reverse(int arr[],int i,int j)
{
int tmp;
while(i<j)
{
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
i++;
j--;
}
}
void quickSort(int arr[],int i,int j)
{
int m=0;
if(i<j)
{
m= part(arr, i, j);
quickSort(arr ,i,m-1);
quickSort(arr,m+1,j);
}
}
int findk(int arr[],int i,int j,int k)
{
int m=0;
if(k>0)
{
m=part(arr,i,j);
if(k == m-i+1) return arr[m];
if(k<m-i+1)
{
return findk(arr,i,m-1,k);
}
else
{
return findk(arr,m+1,j,k-m+i-1);
}
}
return -1;
}
int main(void)
{
int arr[10]={1,2,3,4,5,6,7};
int a = findk(arr,0,6,0);
printf( "hit %d\n",a);
// quickSort(arr,0,6);
//for(int i=1;i<=7;i++)
//printf( "hit %d \n", findk(arr,0,6,i));
}