【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

从一堆数据中挑选n个最大的数,这个问题是网上流传的比较广的几个问题之一。具体来说,它的意思就是:假设我们有100个数据,我们需要挑选出最大的n个数据(n < 100),那么有没有办法实现这样一个目标呢?在这里,我想从排序的角度看看有没有什么办法可以实现这样一个目标。

在前面的博客当中,我们实现的排序算法有下面几种:

(1) 冒泡排序、插入排序、希尔排序

(2) 快速排序

(3) 合并排序

(4) 堆排序

(5) 选择排序

(6) 基数排序

那么是不是这8种算法都适合今天的题目呢?我简单的对它们进行了分析和归类:

a)不到最后无法求出最大数据的算法,(插入算法,合并算法,基数排序)

这些算法的特点就是可以保证局部的数据基本有序,但是无法保证全局的数据有序。在全部数据得到正确地排序之前,没有人知道最大的数据是什么。所以针对这个题目而言,要想知道最大的n个数,那就等于要对所有的数据全部排序一遍。

b)每次求出一个最大的数据,依次类推,直到所有的数据都已经排序。(冒泡排序、希尔排序、选择排序、堆排序)

这些算法的特点就是,排序的时候,所有的数据都是按照从大到小排列出来的。按照冒泡排序来说,首先我们选出最大的数据,然后是第二大的数据,依次类推,直到第n大的数据找到为止。堆排序也是这样,我们在构建堆之后,也是每次从堆顶获得一个数据,不断调整堆,再接着获得第二大、第三大......第n大的数据的。我们以冒泡排序为例,看看这一次的算法应该怎么写?

void find_n_max_number(int array[], int length, int number)
{int inner ;int outer;int median;if(NULL == array || 0 == length)return;if(number > length)return;for(outer = length -1; outer > (length - 1 - number); outer --){for(inner = 0; inner < outer; inner ++){if(array[inner] > array[inner +1]){median = array[inner];array[inner]  = array[inner + 1];array[inner + 1]= median;}}}
}

c)迭代搜索,首先对数据进行分类,小于于数组第一个数据的排在左边,大于的排在右边。如果右边的数据小于n,为m,那么在左边数组继续寻找剩下的(n-m)个数据;如果右边的数据大于n,那么在右边的数据继续寻找。( 快速排序)
    不知道上面的解释说明白了没,没有清楚的同学可以看一看下面这个代码。

int partion(int array[], int start, int end, int swap[])
{int loop;int left = 0;int right = end - start;int value = array[start];for(loop = start +1; loop <= end; loop++){if(array[loop] < value)swap[left ++] = array[loop];elseswap[right --] = array[loop];}swap[left] = value;memmove(&array[start], swap, sizeof(int) * (end - start +1));return left + start;
}void _quick_sort(int array[], int start, int end, int swap[], int number)
{int middle;if(start < end){middle = partion(array, start, end, swap);if((number - 1) > (end - middle))_quick_sort(array, start, middle -1, swap, number - (end - middle + 1));else_quick_sort(array, middle + 1, end, swap, number);}
}void find_n_max_number(int array[], int length, int number)
{int* swap ;if(NULL == array || 0 == length)return;swap = (int*)malloc(sizeof(int) * length);_quick_sort(array, 0, length-1, swap, number);free(swap);
}

总结:

至于这些算法的结果怎么样,各位朋友们可以自己利用自己的电脑好好测试一下。

一步一步写算法(之挑选最大的n个数)相关推荐

  1. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  2. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  3. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  4. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  5. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  6. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  7. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  8. 一步一步写算法(之 算法总结)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/6993718 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎转 ...

  9. 一步一步写算法(之 算法总结)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇.按照计划,还有三个部分的内容没有介绍 ...

  10. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

最新文章

  1. 征集并发文献译者之Disruptor
  2. linux mysql 系统时间函数吗_linux下获取系统时间的方法
  3. jenkins 下载插件 一直失败_Jenkins 配置国内插件更新源
  4. Java中怎样创建线程安全的方法
  5. PowerBI随笔(7)-lookupvalue、divide
  6. 【DP】【容斥】Nice to Meet You(AT3634)
  7. 中科大计算机复试题目,08中科大11系(计算机)复试
  8. 二. 2d-2d 对极约束 估计相机位姿pose(R,t)
  9. CMake test目录和项目同名错误
  10. 激活层是每一层都有吗_每一个日出日落,都是岁月痕迹。这些在东软的第一次,你还记得吗...
  11. html5 切换语言,Vue项目中使用国际化, 并配置动态切换语言的方法
  12. js 容易忽略的小知识点
  13. i386和i686的区别
  14. 鱼刺少的鱼都有哪些 这几种鱼刺少又美味
  15. 单片机IO详解(上拉 下拉 准双向 输入 输出 推挽 开漏)
  16. vscode git error: would clobber existing tag
  17. whai is gradient vanishing and exploding ?
  18. SpringBoot之RMI的简单使用
  19. 【大话Java面试】-如何通俗易懂的理解Redis的回收算法LRU?
  20. Nginx封禁恶意IP

热门文章

  1. [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
  2. hibernate联合主键
  3. javascript本地,宿主,内置对象
  4. 解决IE8不支持数组的indexOf方法
  5. DELPHI存储过程调用
  6. mfc控件随框变化(EasySize的用法,仔细看绝对有用)
  7. 边缘计算 VS 云计算,谁才是未来?
  8. CSS 两列布局 之 左侧适应,右侧固定 3种方式
  9. PHP下拉框选择的实现方法
  10. ruby map, reduce, select, reject, group_by