前言
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]);
}
}
后记
参考书籍
- 《经典算法大全》
- 维基百科