选择问题-确定N个数中前K个最大值

算法:前K元素读入数组并对其排序,将剩下的元素再逐个读入,当新元素小于数组中第k个元素则忽略,否则将其放到数组中正确位置上,同时将数组中的一个元素挤出数组。

代码采用JS!

/*Code*/

window.onload  = entryFun;

//入口函数
function entryFun() {

var sortNumber = new Array(100, 90, 80, 70, 85, 95, 99);

var k = 4;

document.write(selPro(sortNumber, k));

}

function arr_Oper(sortNumber, time) {

for (i = sortNumber.length - 1; i >= sortNumber.length - time + 1; i--) {

sortNumber[i] = sortNumber[i - 1];

}

return sortNumber;

}

// 快速排序
function quickSort(sortNumber, left, right) {

if (left > right) {

return;

}

var i   = left;

var j   = right;

var key = sortNumber[left];

while (i < j) {

while (i < j && sortNumber[j] < key) {

j--;

}

sortNumber[i] = sortNumber[j];

while (i < j && sortNumber[i] > key) {

i++;

}

sortNumber[j] = sortNumber[i];

}

sortNumber[i] = key;

quickSort(sortNumber, left, i - 1);

quickSort(sortNumber, i + 1, right);

return sortNumber;

}

function selPro(sortNumber, k) {

var rs_Arr     = quickSort(sortNumber, 0, k - 1);

var sort_Arr   = rs_Arr.slice(0, k);

var unsort_Arr = rs_Arr.slice(k);

var time       = 0;

for (var i = k; i <= sortNumber.length - 1; i++) {

time = 0;

if (rs_Arr[i] < sort_Arr[k - 1]) {

continue;

}

if (rs_Arr[i] > sort_Arr[0]) {

time = sort_Arr.length;

arr_Oper(sort_Arr, time);

sort_Arr[0] = rs_Arr[i];

}

else {

for (var j = k - 1; j >= 1; j--) {

if (rs_Arr[i] > sort_Arr[j]) {

time++;

}

}
            
            j = sort_Arr.length - time;

window.alert(time);

window.alert("j=" + j);

arr_Oper(sort_Arr, time);

sort_Arr[j] = rs_Arr[i];

//return sort_Arr;

}

}

return sort_Arr;

}

时间: 2024-10-27 09:10:41

选择问题-确定N个数中前K个最大值的相关文章

设计一组N个数,确定其中第k个最大值

今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 解法2: 利用选择排序或交互排序,K次选

2.用选择排序对10个数进行排序

[原理] 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. [复杂度和稳定性] (1)选择排序时间复杂度选择排序的时间复杂度是O(N2).假设被排序的数列中有N个数.遍历一趟的时间复杂度是O(N),需要遍历N-1.因此,选择排序的时间复杂度是O(N2). (2)选择排序稳定性选择排序是稳定的算法,它满足稳定算法的定义.算法稳定性 -- 假设在数列中存在

编程题:输入a、b两个数,输出其中最大值。

#include<stdio.h> float max(float x,float y) { float z; if(x>y) z=x; else z=y; return z;} main() { float a,b,c; scanf("%f,%f",&a,&b); c=max(a,b); printf("%f,%f,the max is %f\n",a,b,c); } 输入:23,56 输出:23.000000,56.000000

【C++】输入8个数,求出最大值与最小值

//输入8个数,求出最大值与最小值 #include <iostream> using namespace std; int max(int b[],int n),min(int b[],int n); int main() { int a[8]; cout<<"输入8个int型数 :"; for(int i=0;i<8;i++) cin>>a[i]; cout<<"最大数为 "<<max(a,8)&

从键盘录入几个数,求取最大值?

首先声明一个方法名compare1的方法(也可以直接在main函数中执行) public static void compare1() {/*** 从键盘录入几个数,求取最大值*/System.out.println("从键盘录入5个数:");Scanner sc = new Scanner(System.in);int arr[] = new int[5];for(int i = 0;i<5;i++) {arr[i] = sc.nextInt();}System.out.pri

二分查找,查指定值、小于k的最大值,大于k的最大值

我们经常会用到二分查找 二分查找应该很多人都会写了,今天要写一个用二分查找找到小于k的最大值的时候看了很久不懂他设计的思路,后来想通了,记录一下. 所以这篇主要是讲 用二分查找找到小于k的最大值和大于k的最大值. 二分查找查找指定值 这个挺简单的,直接上代码吧 //获取值是k的位置,找不到则返回-1 public static int getK(int[] a, int k){ if(a.length == 0){ return -1; } int l = 0; int r = a.length

HDU 5101 Select(不同集合的两个数大于k的方案数)

Select Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1422    Accepted Submission(s): 395 Problem Description One day, Dudu, the most clever boy, heard of ACM/ICPC, which is a very interesting

找出数组中前K小的值&amp;最小堆

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 代码 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { if (input.length==0||k>input.length) { return new ArrayList<>(); } ArrayList<Integer> list

jquery学习 - jquery选择孩子元素和个数/获取css属性

选择器 选择孩子元素和css属性 获得孩子元素的个数 选择器 jquery的选择器很强大,可以的话,能用jquery的时候,真的是非常方便. 选择孩子元素和css属性 先看下面的代码: SelectColor = $(ColorId).children('svg').children('rect').css('fill'); 这个代码很容易懂.首先: ColorId = $("#id"); svg是一个子元素的标签. rect是svg下的子元素 fill是rect的一个css属性 可以