• 无序数组中用 快速排序的分治思想 寻找第k大元素


    #include <stdio.h>
    
    int *ga;
    int galen;
    void print_a(){
        for(int i = 0; i < galen; i++){
            printf("%d ",ga[i]);
        }
        printf("
    ");
    }
    
    //k = di k da yuan su
    int quick_findk(int *a, int len, int k){
        if(len <= 1)
            return a[0];
        int *p,*l,*r,tmp;
        p=&a[len-1];
        l=a;
        r=&a[len-2];
        while(l < p){
            printf("len:%d , k:%d
    ",len,k);
            print_a();
            while(*l<*p && l!=p)
                l++;
            while(*r>*p && r>l)
                r--;
    
            if(l != r && l < r){
                tmp = *l;
                (*l) = (*r);
                *r = tmp;
            }else{
                tmp = *p;
                (*p) = (*l);
                *l = tmp;
                print_a();
                int index = l - a;
                printf("index:%d v:%d
    ",index,a[index]);
                if(index == len-k){
                    return *l;
                }else if(index < len-k){//in right
                    return quick_findk(&a[index+1],len-index-1,k);
                }else if(index > len-k){//in left
                    return quick_findk(a,index,k-(len - index));
                }
            }
        }
    }
    
    
    void main(){
        int a[] = {6,1,4,3,5,2};
        int len = sizeof(a) / sizeof(a[0]);
        ga = a;
        galen = len;
        int r = quick_findk(a, len, 4); //3
        printf("%d 
    ",r);
    }
    root@ubuntu:~/cdir# gcc quicksort_findk.c -o quicksort_findk.bin -g
    root@ubuntu:~/cdir# ./quicksort_findk.bin 
    len:6 , k:4
    6 1 4 3 5 2 
    len:6 , k:4
    1 6 4 3 5 2 
    1 2 4 3 5 6 
    index:1 v:2
    len:4 , k:4
    1 2 4 3 5 6 
    1 2 4 3 5 6 
    index:3 v:6
    len:3 , k:3
    1 2 4 3 5 6 
    1 2 4 3 5 6 
    index:2 v:5
    len:2 , k:2
    1 2 4 3 5 6 
    1 2 3 4 5 6 
    index:0 v:3
    3 

    最后 = 3

  • 相关阅读:
    基本输入输出函数
    变长参数表函数的编写
    一文精通Linux 命令行
    Linux 下的种种打包、压缩、解压命令
    GIT补丁怎么打?
    GIT 合并的冲突解决途径
    GIT 库整理方法
    GIT中常用命令详解1.reset
    霍夫曼编码及译码
    C语言链表实现队列
  • 原文地址:https://www.cnblogs.com/cyy12/p/11806707.html
Copyright © 2020-2023  润新知