排序法-改良的选择排序(C)

来源:互联网 发布:tcp udp 端口 编辑:程序博客网 时间:2024/05/29 09:21

Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是一个二元树,也就是每一个父节点最多只有两个子节点(关于树的详细定义还请见资料结构书籍),堆积树的 父节点
若小于子节点,则称之为最小堆积(Min Heap ),父节点若大于子节点,则称之为最大堆积( Max Heap),而同一层的子节点则无需理会其大小关系,例如下面就是一个堆积树:
这里写图片描述

我们可以用数组来存储堆积树的所有元素和顺序,索引我们定为从1开始,把左节点的索引记为s,则右节点为s+1,父节点为s/2,
就如上图所示,将上图的堆积树转换为一维阵列之后如下所示:
这里写图片描述

首先必须知道如何建立堆积树,加至堆积树的元素会先放置在最后一个树叶节点位置,然后检查父节点是否小于子节点(最小堆积),将小的元素不断与父节点交换,直到满足堆积树的条件
为止,例如在上图的堆积加入一个元素12,则堆积树的调整方式如下所示:
这里写图片描述

建立好堆积树之后,树根一定是所有元素的最小值,再将最小值取出,然后调整数为堆积树。
不断重复以上的步骤,就可以达到排序的效果,最小值的取出方式是将树根与最后一个树叶节点交换,然后切下树叶节点,重新调整树为堆积树,如下所示:

这里写图片描述

调整完毕后,树根节点又是最小值了,于是我们可以重覆这个步骤,再取出最小值,并调整树为堆积树,如下所示:
这里写图片描述

如此重覆步骤之后,由于使用一维阵列来储存堆积树,每一次将树叶与树根交换的动作就是将最小值放至后端的阵列,所以最后阵列就是变为已排序的状态。

C代码

#include<stdio.h>#include<stdlib.h>#define MAX 10void swap(int &a, int &b){    int temp;    temp = a;    a = b;    b = temp;}void creat_heap(int *number){    int heap[MAX + 1] = { -1 };    int i, j;    int s, p;    for (i = 1; i < MAX + 1; i++)    {        heap[i] = number[i];        s = i;        p = s / 2;        while (heap[s] < heap[p] && s >= 2)        {            swap(heap[s], heap[p]);            s = p;            p = s / 2;        }    }    for (i = 1; i < MAX + 1; i++)        //printf("%d ", num[i]);        number[i] = heap[i];}void heap_Sort(int *number){    int m = MAX;    int p,s;    while (m > 1)    {        swap(number[1], number[m]);        m--;        p = 1; //根节点        s = 2 * p;//左子节点        //重新调整为堆积树        while (s < m)        {            if (number[s+1] < number[s])            {                s++; //右子节点            }            swap(number[p], number[s]);            p = s; //重新定义父节点            s = 2 * p; //父节点p的左子节点        }    }    for (int i = MAX; i > 0; i--)        printf("%d ", number[i]);}int main(){    int num[11] = { -1,18,15,21,4,5,2,7,11,56,12 };    creat_heap(num);    heap_Sort(num);    system("pause");    return 0;}
原创粉丝点击