leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22

贴原题:

Given an array of size n, find the majority element. The majority
element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element
always exist in the array.

Credits: Special thanks to @ts for adding this problem and creating
all test cases.

解析:
  本题是要找出一个数组中个数超过一半的数。
  我的思路是排序之后,中间的那个数就是我们所要找的数。但是我用快速排序来做就已经时间超出了,于是百度查了查各类排序算法的复杂度问题,发现堆排序的复杂度比快速排序还要低。便想到了用堆排序来解决这个问题。
  或许我应该写篇博客专门总结一下各类排序算法。
  
这里写图片描述(图源:百度图片,侵删)

快速排序: 时间超出

int majorityElement(int* nums, int numsSize) {
    my_qsort(nums, numsSize);//快速排序我写过很多次了,这里就不重复了,或者可以调用库函数
    return *(nums+numsSize/2);
}

堆排序

void HeapAdjust(int arr[], int root, int len)  //堆调整,构建大顶堆
{
    int lChild=2*root;
    int rChild=lChild+1;
    int largest=root;
    if(lChild<len && arr[lChild]>arr[largest])//判断左节点和根节点大小,把较大的放到根节点
    {
        largest=lChild;
    }
    if(rChild<len && arr[rChild]>arr[largest])//判断右节点和根节点大小,把较大的放到根节点
    {
        largest=rChild;
    }
    if(largest!=root)
    {
        arr[largest]=arr[root]^arr[largest];//把根、左、右三者的最大值放到根节点
        arr[root]=arr[root]^arr[largest];
        arr[largest]=arr[root]^arr[largest];
        HeapAdjust(arr, largest, len);//交换之后其下的叶子节点可能不保持最大顶堆状态,递归调整
    }
}
void HeapSort(int arr[], int length)  //堆排序 
{  
    int i;
    for(i=length/2; i>=0; i--)//调整非叶子节点部分,构建大顶堆
    {
        HeapAdjust(arr, i, length);
    }
    for(i=length-1; i>0; i--)//进行完一次堆调整之后最大值在堆头,把堆头和堆尾交换,调整个数减一
    {
        arr[i] = arr[0]^arr[i];//交换堆头和堆尾
        arr[0] = arr[0]^arr[i];
        arr[i] = arr[0]^arr[i];
        HeapAdjust(arr, 0, i);//堆调整  
    }
}
int majorityElement(int* nums, int numsSize) {
    HeapSort(nums, numsSize);
    return *(nums+numsSize/2);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值