zoukankan      html  css  js  c++  java
  • 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("
    建立堆积树:");
    	createheap(number);
    	for(i = 1; i <= MAX;i++)
    		printf("%d ", number[i]);
    	printf("
    ");
    	heapsort(number);
    	printf("
    ");
    	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("
    排序中:");
    		for(i = MAX;i > 0; i--)
    			printf("%d ", number[i]);
    		}
    	}
    

    后记

    参考书籍

    • 《经典算法大全》
    • 维基百科
  • 相关阅读:
    laravel扩展xls处理maatwebsite/excel
    php连接ftp
    sublime
    非对称加密
    cron以及在laravel中使用cron
    多任务-python实现-生成器相关(2.1.13)
    多任务-python实现-迭代器相关(2.1.12)
    多任务-python实现-协程(2.1.11)
    多任务-python实现-多进程文件拷贝器(2.1.10)
    多任务-python实现-进程pool(2.1.9)
  • 原文地址:https://www.cnblogs.com/actanble/p/6711095.html
Copyright © 2011-2022 走看看