actanble

导航

Algorithm Gossip (36) Heap排序法( 堆排序 )

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

36.Algorithm Gossip: Heap排序法( 堆排序 ) -改良的选择排序

说明

选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快,Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,因而称之为改良的选择排序法。

解法

分析和解释

代码

拓展和关联

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
void createheap(int[]);
void heapsort(int[]);
int main(void) {
	int number[MAX+1] = {-1};
	int i, num;
	srand(time(NULL));
	printf("排序前:");
	for(i = 1; i <= MAX;i++){
		number[i] = rand()% 100;
		printf("%d ", number[i]);
		}
	printf("\n建立堆积树:");
	createheap(number);
	for(i = 1; i <= MAX;i++)
		printf("%d ", number[i]);
	printf("\n");
	heapsort(number);
	printf("\n");
	return 0;
	}
void createheap(intnumber[]){
	int i, s, p;
	int heap[MAX+1] = {-1};
	for(i = 1; i <= MAX;i++){
		heap[i] = number[i];
		s = i;
		p = i / 2;
		while(s >= 2 && heap[p] > heap[s]){
			SWAP(heap[p],heap[s]);
			s = p;
			p = s / 2;
			}
		}
	for(i = 1; i <= MAX;i++)
		number[i] = heap[i];
	}
void heapsort(intnumber[]) {
	int i, m, p, s;
	m = MAX;
	while(m > 1) {
		SWAP(number[1],number[m]);
		m--;
		p = 1;
		s = 2 * p;
		while(s <= m) {
			if(s < m && number[s+1] < number[s])
				s++;
			if(number[p] <= number[s])
				break;
			SWAP(number[p],number[s]);
			p = s;
			s = 2 * p;
			}
		printf("\n排序中:");
		for(i = MAX;i > 0; i--)
			printf("%d ", number[i]);
		}
	}

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

posted on 2017-04-14 21:46  白于空  阅读(110)  评论(0编辑  收藏  举报