【数据结构】将一组数据升序排序(利用堆排序)

原创 2016年05月30日 17:18:59

堆排序相对冒泡排序、选择排序效率很高,不再是O(n^2).


假若将一个序列升序排序好,那么我们来考虑最大堆还是最小堆来排序。假若是最小堆的话,堆的顶端必定是堆中的最小值,这样貌似可以。但是,如果是它的(一边或)子树左子树的节点数据值大于(一边或)右子树的节点数据值,直接打印肯定是错误的,而且对于此时的堆我们也无法操控来调整好正确的顺序了。


那我们换成最大堆来实现升序想,当我们把序列调整成为最大堆后,最大堆顶端的数据值是最大的,然后我们将这个最大值与堆的最后一个叶子节点值来进行交换,再将交换后的顶端值进行调整,换到合适的位置处……重复这样的工作,注意:进行第2次交换就要将顶端元素值与倒数第2个节点元素值交换了,且调整顶端元素位置也不能一直调整到size-1处。(因为:size-1处的值已经是最大)


代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

#include<assert.h>


void AdjustDown(int* a,int parent, int size)
{
    int child = 2 * parent + 1;
    while (child < size)
    {
        if (child + 1 < size && a[child] < a[child + 1])
        {
            ++child;
        }
        if (a[child]>a[parent])
        {
            swap(a[child], a[parent]);
            parent = child;
            child = 2 * parent + 1;
        }
        else
        {
            break;
        }
    }
}


void Print(int*a, int size)
{
    cout << "升序序列为:"<<endl;
    for (int i = 0; i < size; i++)
    {
        cout << a[i] << "  ";
    }
    cout << endl;
}


void HeapSort(int* a,int size)
{
    assert(a);
    
    //建成最大堆
    for (int i = (size - 2) / 2; i >=0; i--)
    {
        AdjustDown(a,i, size);
    }

    //交换顺序
    for (int i = 0; i < size; i++)
    {
        swap(a[0], a[size - i - 1]);
        AdjustDown(a, 0, size-i-1);
    }    
}

 
void Test()
{
    int arr[] = { 12, 2, 10, 4, 6, 8, 54, 67,100,34,678, 25, 178 };
    int size = sizeof(arr) / sizeof(arr[0]);
    HeapSort(arr, size);    
    Print(arr,size);
}


int main()
{
    Test();
    system("pause");
    return 0;
}


时间复杂度:

(n-2)/2*lgn+n*(1+lgn)--->O(n).


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1768162

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于排序的方法求一组数的中位数(冒泡排序&选择排序) -- 浙大《数据结构》第二版 例2.6

基于排序的方法求一组数的中位数 这个例题写上两种方法。其实既然是基于排序的,那么方法的不同,区别就在采用的排序方法的不同。 自己想到的是冒泡排序(你说说你们,学了这么久的数据结构,连个冒泡排序都不会写...

数据结构学习笔记5-寻找最小的k个数(选择排序和堆排序)

本文摘自《寻找最小的k个数》题目描述输入n个整数,输出其中最小的k个。

数据结构面试之十一——排序2(归并、快速、堆排序)

题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。 十、数据结构面试之十一——排序2(归并、快速、堆排序) 5. 归并排序 【...

中国大学MOOC-陈越、何钦铭-数据结构 排序(堆排序)

思路: 这篇文章是接刚才的希尔排序,在这次我是用堆排序实现的。代码如下:#include using namespace std; #define MaxSize 100000//定义数组的最大容量...

数据结构学习笔记 --- 排序(选择排序、堆排序)

1. 引言  本文主要讲解一些常见的选择排序和堆排序。 2. 选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码最小的记录,顺序存放在已...

数据结构堆排序

数据结构学习----线性表的链式表示之升序排序的单链表(Java实现)

线性表接口LList: package com.clarck.datastructure.linked; /** * 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数据元素的数据类...

《数据结构-堆排序》

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)