当前位置: 首页 > news >正文

选择算法

    基于快排的选择算法:就是从数组中随机选一个数,比这个数小的放左边,大的放右边,如果放左边的数的个数等于k-1,说明现在选的这个数就是第k大的数。如果放左边的数的个数大于k个,则递归寻找左边的数组中的第k小的元素,找出的这个数,就是原来数组中的第k大元素。 如果放左边的数的个数小于k个,则在右边的数组当中找第k-p-1小的元素(p为左边数组的大小)。
  基于堆的选择算法:维护一个k个元素的最大堆,首先从数组当中取出k个数填入这个堆。然后每次从数组中取出一个元素,和堆顶进行比较。如果比堆顶元素大,则忽略。如果比堆顶元素小,则替换掉堆顶元素,并做一次下滤。

#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <algorithm>
#include "windows.h"
using namespace std;
bool cmp(int a,int b){
    return a<b;
}
int k;//第k小
const int num  = 10000;//数组大小
int testData[num],testData1[num],testData2[num];
//快排方法
int search1(int start, int end , int order){
    if (start >= end-1) return testData1[start];
    
    int x  = start;
    int tmp = rand()%(end-start)+start;
    swap(testData1[x],testData1[tmp]);
    tmp = testData1[x];
    
    int y = end-1;
    while(x < y){
        while (x < y && testData1[y] >= tmp){
            y--;
        }
        if (x < y){
            testData1[x] = testData1[y];
            x++;
        }
        while (x < y && testData1[x] <= tmp){
            x++;
        }
        if (x < y){
            testData1[y] = testData1[x];
            y--;
        }
    }
    testData1[x] = tmp;
    
    if (x-start == order-1) return testData1[x];
    if (x-start >= order){
        return search1(start, x , order);
    }
    else{
        return search1(x+1 , end , order-(x-start)-1 );
    }
}
//堆方法
int search2(int start, int end , int order){
    make_heap(&testData2[0],&testData2[order],cmp);
    for (int i = order ; i <  num; i++){
        if (testData2[i] < testData2[0]){
            pop_heap(&testData2[0],&testData2[order],cmp);
            testData2[order-1] = testData2[i];
            push_heap(&testData2[0],&testData2[order],cmp);
        }
    }
    return testData2[0];
}
int main(){
    srand(time(0));
    cout << "k  time1   time2"<<endl;
    for ( k = 1 ; k < 1000 ;k+=20){
        int cc = 1000;
        int time1 = 0,time2 = 0;
        
        while(cc--){
            for (int i = 0 ; i < num ; i++){
                testData[i] = rand()%40000;
                testData1[i] = testData[i];
                testData2[i] = testData[i];
            }
            
            int start_time=GetTickCount();
            search1(0,num,k);//快排
            int end_time=GetTickCount();
            time1 += end_time-start_time;   
            start_time=GetTickCount();
            search2(0,num,k);//最小堆
            end_time=GetTickCount();
            time2 += end_time-start_time;           
        }
        cout << k << "  " << time1 << " "<<time2 << endl;
    }
    return 0;
}
}


 
实验结果:
 


PS:基于快排的算法不稳定,最坏情况是O(n^2)的。在算法导论第9.3节有一个最坏情况为O(n)的选择算法。 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

相关文章:

  • 【点杀iOS】深拷贝浅拷贝copy的那些事儿
  • 【性能调优】如何将Hybris启动时间减少30%-50%
  • springJDBC一对多关系,以及Java递归,jsp递归的实现
  • 如何修改myeclipse中web项目的工作路径或默认路径
  • Leetcode——最长不重复子串
  • 修改 SVN 账户密码的方法
  • 一个有趣的算法题。。。
  • Codeforces Gym 100733A Shitália 计算几何
  • configure: error: png.h not found.
  • About SOuP
  • js数组如何去重
  • Scala入门指南与建议
  • Java学习之神奇的i=i++
  • How to setup Wicket Examples in Eclipse
  • spring MVC 跳转到另一个controller方法
  • [译]CSS 居中(Center)方法大合集
  • 【个人向】《HTTP图解》阅后小结
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【译】理解JavaScript:new 关键字
  • 3.7、@ResponseBody 和 @RestController
  • co.js - 让异步代码同步化
  • Java小白进阶笔记(3)-初级面向对象
  • js数组之filter
  • node 版本过低
  • Redux系列x:源码分析
  • scrapy学习之路4(itemloder的使用)
  • 给github项目添加CI badge
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 记一次用 NodeJs 实现模拟登录的思路
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 我从编程教室毕业
  • 一天一个设计模式之JS实现——适配器模式
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragam once 和 #ifndef 预编译头
  • #QT(TCP网络编程-服务端)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)字符分类函数
  • (二)Linux——Linux常用指令
  • (七)Knockout 创建自定义绑定
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)fock函数详解
  • ***原理与防范
  • .describe() python_Python-Win32com-Excel
  • .htaccess配置重写url引擎
  • .NET Core 2.1路线图
  • .net core控制台应用程序初识
  • .NET DataGridView数据绑定说明
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net程序集学习心得
  • .NET中GET与SET的用法
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [Android]How to use FFmpeg to decode Android f...