堆排序

  由于14号要去招面试,于是百度了一下相关面经,看到一道题是讨论快速排序与堆排序的效率什么的…..在此之前,我对堆排序的理解是错误了=_=…之前我以为是每次调一次小根堆或者大根堆,然后就取出根元素,便可以得到一个排序的数组了….但是想想时间复杂度,感觉不对劲,于是就开始动手实现了。
  参考了这篇文章对堆排序的讲解:https://www.cnblogs.com/chengxiao/p/6129630.html
  看完后我才知道是把每次把根元素放到数组末端,然后再调整堆,于是乎就打算用python实现,但是由于python没有条件表达式,写着写着发现运算符:?: ,不能使用,于是乎改用C++去实现了=v=,好久没用C++了,以及在用python实现的过程中,想到了python的数组切片,于是乎我在C++中实现用到了。
  上面网址的讲解我理解为:
    1、排序为升序,大根堆,降序的话就小根堆。
    2、每次调整堆后,把根元素换到当前调整的二叉树的最后节点,也就是数组末端。
    3、每次把根与末端元素互换位置,换到末端的元素将不进行后续的调整,可以把它视为不在该树里面或者从二叉树中移除,就相当于每次调整的数组范围不同,所以用到切片。

int* dsort(int *arr, int len) {
    if (len == 0) {
        return arr;
    }
    int rear = len;
    for (int pos = ((len+1) / 2 - 1); pos >= -1; pos--) {
        if (pos < 0) {
            swap(arr[0], arr[rear]);
            rear--;
            return dsort(arr, rear);
        }
        int tpos1 = 2 * pos + 1, tpos2 = 2 * pos + 2;
        if (tpos2 <= len - 1) {
            int tmpp = arr[tpos1] > arr[tpos2] ? tpos1 : tpos2;
            bool is = arr[pos] > arr[tmpp] ? true : false;
            if (!is) {
                swap(arr[pos], arr[tmpp]);
            }
        }
        else {
            bool is = arr[pos] > arr[tpos1] ? true : false;
            if (!is) {
                swap(arr[pos], arr[tpos1]);
            }
        }
    }
}
int main()
{
    int a[] = { 9,6,8,10,4,3,1,11 };
    int len = sizeof(a)/sizeof(a[0])-1;
    int *b=dsort(a, len);
    for (int i = 0; i <= len; i++) {
        cout << b[i] << " ";
    }
    return 0;

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值