码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2015-09-01 00:04:12      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:堆排序

一、概念

    堆排序是利用堆这种数据结构的性质设计的一种排序方式。

    堆是一个近似完全二叉树的结构,并满足性质:子节点的键值或则索引值总是小于等于(或则大于等于)父节点的。

    是不稳定排序。

二、原理

    1.首先将待排序的数组进行堆化,构建成堆结构

    2.将堆首和堆尾进行交换

    3.将堆大小减一,并调整剩下的数据,将数组顶端数据调整到合适的位置,保证依然保证是堆的结构

    4.重复2、3,直到大小为1,此时数据已经有序

三、复杂度

    时间复杂度:O(nlog(n))

    空间复杂度:O(1)

四、原理图

    技术分享

    五、代码实现

    

//从root位置开始向下调整,数组长度为size
void heap_adjust(int arr[], int root, int size)
{
    int left_child;
    int key;
    
    key = arr[root];
    left_child = 2 * root + 1;
    while (left_child < size) {
        if ((left_child + 1 < size) && (arr[left_child + 1] > arr[left_child])) {
            left_child++;
        }
        if (arr[left_child] <= key) {
            break;
        }
        arr[root] = arr[left_child];
        root = left_child;
        left_child = 2 * root + 1;
    }
    arr[root] = key;
}

//将待排序数组进行堆化
void build_heap(int arr[], int size)
{
    int index;
    
    for (index = size / 2; index >= 0; index--) {
        heap_adjust(arr, index, size);
    }
}

//用于交换两个数(用异或只适用整数)
void swap(int *x, int *y)
{
    *x = *x ^ *y;
    *y = *x ^ *y;
    *x = *x ^ *y;
}

//堆排序主函数
void heap_sort(int arr[], int size)
{
    int index;
    
    build_heap(arr, size);
    
    for (index = size - 1; index >= 1; index--) {
        swap(&arr[0], &arr[index]);
        heap_adjust(arr, 0, index);
    }
}


堆排序

标签:堆排序

原文地址:http://happytree007.blog.51cto.com/6335296/1690282

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!