• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++算法之在无序数组中选择第k小个数的实现方法

C++算法之在无序数组中选择第k小个数的实现方法

作者:big_confidence 字体:[增加 减小] 来源:互联网 时间:2017-05-28

big_confidence 通过本文主要向大家介绍了c++算法,c++算法大全,c++排序算法,c++数据结构与算法,银行家算法c++等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了C++算法之在无序数组中选择第k小个数的实现方法。分享给大家供大家参考,具体如下:

从一个无序的整型数组中选出第k小的数,如k=1为最小数,k=n为最大数。这里数组可以是有重复的值!

下面是自己写的一个函数,记在此处来记忆我留下的痕迹!

//选择无序数组中第k小的数
#include <iostream>
using namespace std ;
bool failed = false ;
//这里只考虑数组是int型的
int findnumber(int *array,int start , int end, int k)
{
  if(array == NULL || start > end || k < start || k > end+1 || k <= 0 )
  {
    failed = true ;
    return 0;
  }
  if(start == end)
  {
    return array[start] ;
  }
  int len = end - start + 1 ;
  int tmp = 0 ;
  int ps = rand()%len +start ;
  int tk = k ;
  while(true)
  {
   //分割两数组
   int f = start ;
   int t = array[ps] ;
   int equalnum = 0 ;
   for(int i = start ; i <= end ; i ++ )
   {
        if(array[i]< t )
        {
          tmp = array[f];
          array[f] = array[i];
          array[i] = tmp ;
          f ++ ;
        }else if(array[i] == t)
        {
          tmp = array[f];
          array[f] = array[i];
          array[i] = tmp ;
          f ++ ;
          equalnum ++ ;
        }
    } //end
    f--;
    if(equalnum > tk && (f - start + 1) == equalnum)
    {
      return t ;//这里是记录数据相等的数目,当我们从开始start处到最后处end都被这个值给充斥了,那么肯定是这里面的值了,再进行下去就会陷入死循环了。
    }
    if(tk == (f - start + 1) )
    {
      return t ;
    }
    if((f - start + 1 ) > tk )
    {
      end = f ;
    }else
    {
       start = f + 1  ;
       tk = k - start  ; //这个地方犯过错误,就是写成了k=k-start,在调试的时候老发现无限的循环。后来打印k的值的时候发现k的值都***为负了。这个bug,这个过错使得在一次运行可能会得到正确的数据,但是多次运行后程序就崩溃。
     }
     len = end - start + 1 ;
     ps = rand()%len +start ;
  }
}
int main()
{
  int array[10] = {1,1,1,2,2,1,4,1,1,1};
  for(int i = 0 ; i < 10 ; i ++ )
  {
    cout<<findnumber(array,0,9,i+1)<<endl;
  }
  system("pause");
  return 0 ;
}

</div>

先想好,分析好问题,自己脑中构思好了编写的思路,且想好了程序出错的地方再编程,这样会快的很多,而不是一看到问题就框框的在电脑上敲。

希望本文所述对大家C++程序设计有所帮助。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++算法之在无序数组中选择第k小个数的实现方法
  • C C++ 算法实例大全
  • c++中八大排序算法
  • 简单掌握桶排序算法及C++版的代码实现
  • C++三色球问题描述与算法分析
  • C++德州扑克的核心规则算法
  • C++中十种内部排序算法的比较分析
  • C++实现N个骰子的点数算法
  • C++线性时间的排序算法分析
  • C++遗传算法类文件实例分析

相关文章

  • 2017-05-28浅析STL中的常用算法
  • 2017-05-28C++中const的实现机制深入分析
  • 2017-05-28浅谈c++调用python链接的问题及解决方法
  • 2017-05-28VC++实现View内容保存为图片的方法
  • 2017-05-28C++读写Excel的实现方法详解
  • 2017-05-28C++遍历文件夹下文件的方法
  • 2017-05-28C语言中isdigit()函数和isxdigit()函数的用法
  • 2017-05-28C语言实现基于最大堆和最小堆的堆排序算法示例
  • 2017-05-28数据结构之数组Array实例详解
  • 2017-05-28udp socket客户端和udp服务端程序示例分享

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言实现最长递增子序列问题的解决方法
    • C与C++之间相互调用实例方法讲解
    • C语言 以字符串的形式读写文件详解及示例代码
    • 纯C语言:递归组合数源码分享
    • 浅谈char*类型返回值和字符串常量
    • C++学习小结之二进制转换
    • C++ 11和C++98相比有哪些新特性
    • C#委托所蕴含的函数指针概念详细解析
    • C++大数模板(推荐)
    • C语言基础知识变量的作用域和存储方式详细介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有