选择排序和堆排序

选择排序

选择排序的思想很简单,就是在数组找到一个最大的然后放到最后面(升序)、最前面(降序),或者找一个最小的放到最前面(升序)最后面(降序)。此外还有优化方案就是从两边开始,同时找最大的和最小的,找的后放到正确的位置

void SelectSort1(vector<int>& v)
{
    if (v.empty())
    {
        return;
    }
    int i = 0;
    int j = 0;
    for (i = 0; i<v.size() - 1; i++)//控制交换的次数
    {
        int min = i;
        for (j = i; j<=v.size() - 1; j++)//在该区间找到最小的
        {
            if (v[j]<v[min])
            {
                min = j;
            }
        }
        if (min != i)
        {
            swap(v[i], v[min]);//把最小的放到当开始的位置,下一交换就是下一个位置,同时在这个位置后面寻找最小的
        }
    }
}
void SelectSort2(vector<int>& v)
{
    if (v.empty())
    {
        return;
    }
    int left = 0;
    int right = v.size() - 1;
    while (left < right)
    {
        int min = left;
        int max = right;
        int i = left;
        for (i = left; i <= right; i++)//从两边开始同时寻找最大的和最小的
        {
            if (v[i]>v[max])
            {
                max = i;
            }
            if (v[i] < v[min])
            {
                min = i;
            }
        }
        swap(v[left], v[min]);
        if (max == left)//这里的判断是为了避免最大的在left这个位置,而一交换,最大的数位置就会改变。
        {
            max = min;
        }
        swap(v[right], v[max]);
        left++;
        right--;
    }
}
选择排序是一种不稳定的排序(443第一个4就会移到第二个4后面),时间复杂度为O(n^2)

堆排序


大堆:每个父子节点都大于孩子节点
小堆:每个父子节点都小于孩子节点

堆排序也是选择排序的一种。如果升序就建大堆,每次取堆顶的数往最后放(swap(heap[0],heap[end])),交换往后该堆就不是一个大堆了(除最后一个放好的数),从开始位置进行一次向下调整,又将其调整为一个大堆,把堆顶与最后次位置进行交换,依次这样进行排序。如果降序建小堆

class Solution {
public:
    /**
     * @param A an integer array
     * @return void
     */
     /*void AdjustDown(vector<int>& a,int n,int root)
     {
         int parent=root;
         int child=parent*2+1;
         while(child<n)
         {
             if(child<n-1&&a[child+1]>a[child])
             {
                 child++;
             }
             if(a[parent]<a[child])
             {
                 swap(a[parent],a[child]);
                 parent=child;
                 child=parent*2+1;
             }
             else
             {
                 break;
             }
         }
     }
    void sortIntegers2(vector<int>& A) {
        // Write your code here
        int i=0;
        for(i=(A.size()-2)/2;i>=0;i--)
        {
            AdjustDown(A,A.size(),i);
        }
        int end=A.size()-1;
        while(end>0)
        {
            swap(A[end],A[0]);
            AdjustDown(A,end,0);
            end--;
        }

    }*/

};

此外我们也可以这样实现堆排序
void sortIntegers2(vector& v)
{

    make_heap(v.begin(),v.end());
    sort_heap(v.begin(),v.end());
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值