堆排序

    xiaoxiao2026-09-13  7

     原理图如下:

    思路如下:

    以一个子树为单位,向上遍历。判断同父两个叶子大小(若只有一个跳过),选出最大。判断大的那个叶子节点与父节点,若父节点比大的叶子节点小则交换值。如此反复。

    实现如下:

    /* 堆排序 罗进瑶完成于2016-8-8 *********main.c**************** */ #include<stdio.h> void show(int *a, int size) { int i; for (i = 0;i <size;i++) printf("%d、", a[i]); } void findmax(int *a,int size) { int i, parent, child,temp; for (i = size - 1;i > 0;i--) { child=i; parent = child / 2; if (child + 1 < size&&a[child + 1] > a[child]) child++; if (a[parent] < a[child]) { temp = a[parent]; a[parent] = a[child]; a[child] = temp; } } } void HeapSort(int *a, int size) { int i,temp; for (i = size;i > 0;i--) { findmax(a, i); temp = a[0]; a[0] = a[i - 1]; a[i - 1] = temp; } } int main(void) { //int a[10] = { 10,9,8,7,6,5,4,3,2,1}; int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; printf("原数据:"); show(a, 10); printf("\n排序后:"); //findmax(a, 10); HeapSort(a, 10); show(a, 10); putchar('\n'); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1312011.html
    最新回复(0)