排序:堆排序

来源:互联网 发布:js模拟鼠标移动 编辑:程序博客网 时间:2024/06/01 09:56

#include <stdio.h>// 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i < len; i++){printf ("%4d", a[i]);}printf ("\n");}// a 代表一个数组// i 代表要调整的结点的下标// len  数组的长度void heapify(int *a, int i, int len){int left = 2 * i + 1;     // 左孩子结点下标int right = 2 * i + 2;    // 右孩子结点下标int max = i;     // 三个节点中最大元素的下标if (left < len && a[left] > a[max])max = left;if (right < len && a[right] > a[max])max = right;if (max != i)   // 当前父节点不是所有结点中最大的元素,需要做调整{swap (a, i, max);heapify (a, max, len);   // 调整被交换的结点}}void heapSort (int *a, int len){// 建堆int i;for (i = len/2 - 1; i >= 0; i--){heapify (a, i, len);}// 排序for (i = len-1; i > 0; i--){swap (a, 0, i);       // 拿堆顶元素与队尾元素进行交换len--;                // 找到一个最大元素以后堆大小减1heapify (a, 0, len);  // 调整堆顶元素}}int main(){int a[10] = {9,6,8,0,3,5,2,4,7,1};int len = sizeof(a) / sizeof(a[0]);heapSort(a, len);printA (a, len);return 0;}



原创粉丝点击