从长度为M的无序数组中找出N个最大的数
2017-08-08 21:26
211 查看
1、将数组前N个数调整成最小堆
2、堆顶元素值依次与第N个元素以后的每个元素进行比较
3、若堆顶元素值小,则将堆顶元素重新赋值为新元素的值,并且将前N个数重新调整为最小堆;否则判断下一个元素
4、直到遍历完原数组的最后一个元素后,则最小堆中的元素即为待求的数组中的N个最大的数
复杂度为O(M*log(N))
python代码:
# -*- coding: utf-8 -*-
'''
堆排序
'''
# 从上往下调整堆
def filter_down(array, beg, end):
current, child = beg, 2*beg + 1
temp = array[current]
while child <= end:
if child < end and array[child] > array[child + 1]:
child += 1
if array[child] < temp:
array[current] = array[child]
current, child = child, 2*child + 1
else:
break
array[current] = temp
def find_N_max(array, N):
res = array[:N]
for i in range(int((N - 2)/2), -1, -1):
filter_down(res, i, N - 1)
for j in range(N, len(array) - 1):
if array[j] > res[0]:
res[0] = array[j]
filter_down(res, 0, N - 1)
return res
2、堆顶元素值依次与第N个元素以后的每个元素进行比较
3、若堆顶元素值小,则将堆顶元素重新赋值为新元素的值,并且将前N个数重新调整为最小堆;否则判断下一个元素
4、直到遍历完原数组的最后一个元素后,则最小堆中的元素即为待求的数组中的N个最大的数
复杂度为O(M*log(N))
python代码:
# -*- coding: utf-8 -*-
'''
堆排序
'''
# 从上往下调整堆
def filter_down(array, beg, end):
current, child = beg, 2*beg + 1
temp = array[current]
while child <= end:
if child < end and array[child] > array[child + 1]:
child += 1
if array[child] < temp:
array[current] = array[child]
current, child = child, 2*child + 1
else:
break
array[current] = temp
def find_N_max(array, N):
res = array[:N]
for i in range(int((N - 2)/2), -1, -1):
filter_down(res, i, N - 1)
for j in range(N, len(array) - 1):
if array[j] > res[0]:
res[0] = array[j]
filter_down(res, 0, N - 1)
return res
相关文章推荐
- 164. Maximum Gap *HARD* -- 无序数组找出排序后连续元素的最大间隔
- 长度为n的整形数组,找出其中的任意n-1个数乘积最大的那一组
- 长度为n的数组有正有负,找出元素之和最大的子数组
- 长度为M的数组A,找出位置N,使得A[0]...A[N-1]和A[N]...A[M - 1]的和的乘积为最大。
- (google面试题)找出无序数组中连接和最大排序
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
- 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可 以用除法。要求对算法的时间复杂度和空间复杂度作出分析,可以写思路也可以写程序。
- 有一个array的数组,长度为10000,大小不一,用算法找出该数组中的最大值。
- 一个无序整数数组,数组元素大于5个,请用一种高效的算法找出其中最大的5个值.
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现
- 一个包含正整数和负整数的数组,找出和最大的子串.
- 找出数组和最大的连续子序列
- 数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数。java实现
- 数据结构之——找到无序数组中排序后相邻元素差值的最大值
- 面试题:在一个数组中有0-99之间的整数101个(数组无序),用高效方法找出其中的唯一的重复元素!
- 找出字符串中对称的子字符串的最大长度(最长回文)
- 算法题:找出一个数组中相加值最大的连续序列元素
- Java整型数组的最大长度到底有多长?
- 微软100题(94)找出数组中长度最长的等差数列
- 程序员面试宝典:输入一行字符串,找出其中出现的相同且长度最长的字符串----后缀数组求解