[算法]堆排序
Posted z354681250
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]堆排序相关的知识,希望对你有一定的参考价值。
/*
Name:堆排序
Actor:HT
Time:2015年12月23日
Error Reporte: 1.每次调整的时候,注意size变量!
*/
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define N 200
int a[N];
int sum = 10;
void heapadjust(int adjust,int size) //堆排调整
int largest = adjust;
int temp;
if (2 * adjust <= size && a[largest] < a[2 * adjust]) //左看
largest = 2 * adjust;
if (2 * adjust + 1 <= size && a[largest] < a[2 * adjust + 1]) //右看
largest = 2 * adjust + 1;
if (largest != adjust) //调整
temp = a[adjust];
a[adjust] = a[largest];
a[largest] = temp;
if(largest*2 <= size) heapadjust(largest,size);
for(int i=1;i<=size;i++)
printf(":%d ",a[i]);
printf("\\n");
void heapsort() //堆排序
int i, j;
int temp;
for (i = sum / 2; i > 0; i--) //从下向上建堆
heapadjust(i,sum);
for(i=1;i<=sum;i++)
printf("lll:%d ",a[i]);
printf("\\n");
for (i = sum; i > 1; i--) //依次放到最后的位置
temp = a[i];
a[i] = a[1];
a[1] = temp;
heapadjust(1,i-1); //调整该点
int main()
int i,j;
for(i=1;i<=sum;i++)
scanf("%d",&a[i]);
heapsort();
for(i=1;i<=sum;i++)
printf("%d ",a[i]);
Python N取前K
class heapq:
def __init__(self, k):
self.data = []
self.longest = k
# left = i << 1
# right = i << 1 + 1
# parent = i >> 1
def adjust(self, begin, end):
while begin < end:
ori = begin
left = (begin << 1) + 1
right = (begin << 1) + 2
if left < end and self.data[begin] > self.data[left]:
begin = left
if right < end and self.data[begin] > self.data[right]:
begin = right
if ori != begin:
tmp = self.data[begin]
self.data[begin] = self.data[ori]
self.data[ori] = tmp
else:
break
def push(self, val):
if len(self.data) >= self.longest and self.data[0] < val:
# taken place
self.data[0] = val
self.adjust(0, len(self.data))
elif len(self.data) < self.longest:
# append
self.data.append(val)
for i in range((len(self.data) - 1) >> 1, -1, -1):
self.adjust(i, len(self.data))
def print_all(self):
for i in range(len(self.data) - 1, -1, -1):
tmp = self.data[i]
self.data[i] = self.data[0]
self.data[0] = tmp
self.adjust(0, i)
for i in self.data:
print(i, end=' ')
if __name__ == '__main__':
h = heapq(10)
s = [5, 4, 9, 5, 2, 8, 6, 4]
for i in s:
h.push(i)
h.print_all()
"""
0
1 2
34 56
"""
以上是关于[算法]堆排序的主要内容,如果未能解决你的问题,请参考以下文章