标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。