堆排序(heapsort)

堆排序(heapsort)

Heap Sort

  1. Complete Binary Tree
  2. parent > children

heapify

n = i ---> parent = (i - 1) / 2

​ ----> c1 = 2i + 1

​ ----> c2 = 2i + 2

#include <stdio.h>

void swap(int arr[], int i, int j) {
	int tmp = arr[i];
	arr[i] = arr[j];
	arr[j] = tmp;
}

void heapify(int tree[], int n, int i) {
	if (i >= n) {
		return ;
	}
	int c1 = 2 * i + 1;
	int c2 = 2 * i + 2;
	int max = i;
	if (c1 < n && tree[c1] > tree[max]) {
		max = c1;
	}
	if (c2 < n && tree[c2] > tree[max]) {
		max = c2;
	}
	if (max != i) {
		swap(tree, max, i);
		heapify(tree, n, max);
	}
}

void build_heap(int tree[], int n) {
	int last_node = n - 1;
	int parent = (last_node - 1) / 2;
	int i;
	for (i = parent; i >= 0; i--) {
		heapify(tree, n, i);
	}
}

void heap_sort(int tree[], int n) {
	build_heap(tree, n);
	int i;
	for (i = n - 1; i >= 0; i--) {
		swap(tree, i, 0);
		heapify(tree, i, 0);
	}
}

int main()
{
	int tree[] = {2, 5, 3, 1, 10, 4};
	int n = 6;
	heap_sort(tree, n);
	int i;
	for (i = 0; i < n; i++) {
		printf("%d
",tree[i]);
	}
	return 0;
}

/* !< output */
1
2
3
4
5
10



原文地址:https://www.cnblogs.com/xzpin/p/11493892.html