ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

随机快排思想实现查找第k顺序统计量(C语言实现)

2021-11-20 14:01:16  阅读:249  来源: 互联网

标签:arr end start int C语言 快排 查找 test order


随机快排思想实现查找第k顺序统计量

1 代码

1.1 第k顺序统计量

int OrderStatistics(int *arr, int start, int end, int order)
{// k-th order statistics
    int r = 0;

    if(start == end){ // Only 1 element in the array
        return arr[start];
    }

    r = partition(arr, start, end);
    if(r == order){
        return arr[r];
    }else if(order < r){
        return OrderStatistics(arr, start, r - 1, order);
    }else{
        return OrderStatistics(arr, r + 1, end, order);
    }
}

1.2 划分函数

int partition(int *arr, int start, int end)
{
    int midValue;
    int i = start;
    int j = start + 1;

    srand(time(NULL));
    int random = start + rand() % (end - start + 1);
    // printf("start is %d; end is %d; random is %d\r\n", start, end, random);
    swap(&arr[start], &arr[random]);

    midValue = arr[start];

    for( ;j <= end; j++){
        if(arr[j] <= midValue){
            i++;
            swap(&arr[i], &arr[j]);
        }
    }

    swap(&arr[start], &arr[i]);

    return i;
}

1.3 交换函数

void swap(int *ip1, int *ip2)
{
    int temp = 0;
    temp = *ip1;
    *ip1 = *ip2;
    *ip2 = temp;
}

2 测试例程

int test[] = {5, 1, 5, 3, 4, 6, 7, 8, 9, 5};
int main(int argc, char *argv[])
{
    test_printf(test, sizeof(test) / sizeof(int));
    int order = 10; // index from 1 to ...
    int orderNum = OrderStatistics(test, 0, sizeof(test) / sizeof(int) - 1, order - 1);
    printf("order %d number is %d\r\n", order, orderNum);
    return 0;
}

打印被测数组

void test_printf(int *arr, int len)
{
    int i = 0;
    for( ; i < len; i++){
        printf("|%6d", test[i]);
        if((i+1) % 8 == 0){
            printf("|\r\n");
        }
    }
    if(i%8 != 0){
        printf("|\r\n");
    }
}

标签:arr,end,start,int,C语言,快排,查找,test,order
来源: https://blog.csdn.net/weixin_46201756/article/details/121438463

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有