C++实现查找中位数的O(N)算法和Kmin算法

 更新时间:2014年09月18日 10:44:21   投稿:shichen2014  
这篇文章主要介绍了C++实现查找中位数的O(N)算法和Kmin算法,对于C++程序算法设计有一定的借鉴价值,需要的朋友可以参考下

本文实例讲述了C++实现查找中位数的O(N)算法和Kmin算法,分享给大家供大家参考。具体方法如下:

利用快速排序的partition操作来完成O(N)时间内的中位数的查找算法如下:

#include <iostream>
#include <cassert>
#include <algorithm>
#include <iterator>

using namespace std;

int array[] = {1, 2, 10, 8, 9, 7, 5};
const int size = sizeof array / sizeof *array;

int partition(int *array, int left, int right)
{
 if (array == NULL)
 return -1;

 int pos = right;
 right--;
 while (left <= right)
 {
 while (left < pos && array[left] <= array[pos])
  left++;

 while (right >= 0 && array[right] > array[pos])
  right--;

 if (left >= right)
  break;

 swap(array[left], array[right]);
 }
 swap(array[left], array[pos]);

 return left;
}

int getMidIndex(int *array, int size)
{
 if (array == NULL || size <= 0)
 return -1;

 int left = 0;
 int right = size - 1;
 int midPos = right >> 1;
 int index = -1;

 while (index != midPos)
 {
 index = partition(array, left, right);

 if (index < midPos)
 {
  left = index + 1;
 }
 else if (index > midPos)
 {
  right = index - 1;
 } 
 else
 {
  break;
 }
 }

 assert(index == midPos);
 return array[index];
}

void main()
{
 int value = getMidIndex(array, size);

 cout << "value: " << value << endl;
}

寻找kmin算法如下:

int findKMin(int *array, int size, int k)
{
 if (array == NULL || size <= 0)
 return -1;

 int left = 0;
 int right = size - 1;
 int index = -1;

 while (index != k)
 {
 index = partition(array, left, right);

 if (index < k)
 {
  left = index + 1;
 }
 else if (index > k)
 {
  right = index - 1;
 } 
 else
 {
  break;
 }
 }

 assert(index == k);
 return array[index];
}

希望本文所述对大家C++程序算法设计的学习有所帮助。

相关文章

  • C语言实现C++继承和多态的代码分享

    C语言实现C++继承和多态的代码分享

    本文主要给大家简单讲诉了C和C++的区别以及如何使用C语言模拟实现C++继承和多态,并附上示例代码,是篇相当不错的文章,推荐给喜欢C语言的小伙伴们
    2017-07-07
  • C语言数组按协议存储与按协议解析数据的实现

    C语言数组按协议存储与按协议解析数据的实现

    今天小编就为大家分享一篇关于C语言数组按协议存储与按协议解析数据的实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言中结构体、联合体的成员内存对齐情况

    C语言中结构体、联合体的成员内存对齐情况

    这篇文章主要给大家介绍了关于C语言中结构体、联合体的成员内存对齐情况的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 图文详解c/c++中的多级指针与多维数组

    图文详解c/c++中的多级指针与多维数组

    多维数组与多级指针是初学者经常感觉迷糊的一个地方。超过二维的数组和超过二级的指针其实并不多用。但只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单。
    2016-08-08
  • VC++的if语句应用范围分析

    VC++的if语句应用范围分析

    这篇文章主要介绍了VC++的if语句应用范围分析,对VC++初学者有很好的参考学习价值,需要的朋友可以参考下
    2014-08-08
  • 详解C++中的inline用法

    详解C++中的inline用法

    在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间
    2017-09-09
  • C++选择排序算法实例详解

    C++选择排序算法实例详解

    这篇文章主要为大家详细介绍了C++选择排序算法实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • C++实现基于静态数组的顺序表

    C++实现基于静态数组的顺序表

    这篇文章主要介绍了C++实现基于静态数组的顺序表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++ sort排序之降序、升序使用总结

    C++ sort排序之降序、升序使用总结

    这篇文章主要介绍了C++ sort 排序(降序、升序)使用总结,需要的朋友可以参考下
    2020-11-11
  • C++中strtok()函数的用法介绍

    C++中strtok()函数的用法介绍

    以下是对C++中strtok()函数的使用方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09

最新评论