第K个小的数,快速排序

注意边界条件:
快速排序递归中,避免死循环,进入无限递归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));        
}                                                    

猜你喜欢

转载自blog.csdn.net/u011618329/article/details/89284425
今日推荐