分治法求第k个数

#include
int exchange(int *a, int i, int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}
int partition(int *a, int p, int r){
    int x = a[r];
    int i = p-1, j;
    for(j = p; j < r; j++){
        if(a[j] < x){
            i++;
            exchange(a, i, j);    //交换下标为 i和 j 两个数的位置
        }
    }
    exchange(a, i+1, r);

    return i+1;
}
int quick_sort(int *a, int p, int r, int k, int *find)
{
    if(p < r){
        int x_index = partition(a, p, r); //获取主元素下标
        printf("主元素下标x_index=%d\n", x_index);

        if(k == x_index){
            *find = 1;
            printf("find number k = %d\n", a[x_index]);
            return 0;
        }
        else if(k < x_index){
            quick_sort(a, p, x_index-1, k, find);
        }
        else if(k > x_index){
            quick_sort(a, x_index+1, r, k, find);
        }
    }
}

 int main()
 {
     int find = -1, k;
     printf("请输入k值");
    scanf("%d", &k);
    k = k -1;        //因为数组下标是从0开始算的,这里需要对应地做点调整
     int a[] = {0,9,7,5,3,6,1};  //试验数组

     quick_sort(a, 0, 6, k, &find);
 // 因为在整个递归过程中,存在x_index与k一直不相等的情况(实际上就是递归到底时,
 // x恰好就是是k的相邻元素)。这里用find来标记是否相等。 不过无妨,到了最后,即
 // 便整个数组可能不是有序的,但是下标x_index和k所对应的数,已经恰好是第
 // x_index大和第k大的数了,目的已经达成 ,将对应下标k的元素输出即可

     if(find == -1){      //find为-1说明没有在quick_sort没有找到 k 元素
         printf("find number k = %d\n", a[k]);
     }


/*这里打印当前数组元素的顺序,与题目无关,仅仅是想看看数组最后的顺序 */
     int i;
    for(i = 0; i <= 6; i++){
        printf("%d ", a[i]);
    }
 }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值