[算法]堆排序

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
"""

以上是关于[算法]堆排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法总结之堆排序

排序算法:堆排序-Java实现

[ 数据结构 -- 手撕排序算法第七篇 ] 堆排序(中)堆排序的优化算法

十大经典排序算法总结(堆排序)

算法排序算法之堆排序

排序算法 | 堆排序