排序算法 c++实现

// 冒泡排序
void BubbleSort(vector<int>& vec)
{
    int sz = vec.size();
    for (int i = 0; i < sz-1; ++i)
    {
        bool flag = true;
        for (int j = sz - 1; j > i; --j)
        {
            if (vec[j] < vec[j-1])
            {
                int temp = vec[j];
                vec[j] = vec[j-1];
                vec[j-1] = temp;
                flag = false;
            }
        }
        if (flag == true)
            break;
    }
}
// 快速排序
void quickSort(vector<int>& vec, int left, int right)
{
    if (left >= right)
        return;
    int base = vec[left];
    int _left = left, _right = right;
    while (left < right)
    {
        while (left<right && vec[right]>base) --right;
        vec[left] = vec[right];
        while (left < right && vec[left] <= base) ++left;
        vec[right] = vec[left];
    }
    vec[left] = base;
    quickSort(vec, _left, left - 1);
    quickSort(vec, left + 1, _right);
}
// 堆排序
struct heapSort
{
    heapSort(vector<int> &v):vec(v)
    {
        cout << "调用拷贝构造函数" << endl;
        buildMaxHeap();
    }

    heapSort(vector<int>&& v) :vec(move(v)) 
    { 
        cout << "调用移动构造函数" << endl;
        buildMaxHeap();
    }

    void buildMaxHeap()
    {
        int size = vec.size();
        for (int i = (size >> 1); i >= 0; --i)
            headAdjust(i, size);
    }

    void headAdjust(int i, int len)
    {
        int cur = vec[i];
        // int size = vec.size();
        for (int k = 2 * i; k < len; k *= 2)
        {
            if (k + 1 < len && vec[k] < vec[k + 1])
                k += 1;
            if (vec[k] <= cur)
                break;
            else
            {
                vec[i] = vec[k];
                i = k;
            }
        }
        vec[i] = cur;
    }

    void insert(int num)
    {
        vec.insert(vec.begin(), num);
        headAdjust(0, vec.size());
    }

    
    void print()
    {
        vector<int> temp_vec(vec);
        int size = vec.size();
        for (int i = size - 1; i > 0; --i)
        {
            swap(vec[0], vec[i]);
            headAdjust(0, i);
        }
        for (int i = 0; i < size; ++i)
            cout << vec[i] << ' ';
        cout << endl;
        vec = temp_vec;
    }

    vector<int> vec;
};

int upper_bound(vector<int>& vec, int left, int right, int target)
{
    int pose = -1;
    while (left <= right)
    {
        int mid = left + ((right - left) >> 1);
        if (vec[mid] > target)
        {
            pose = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    return pose;
}
// 插入排序
void insertSort(vector<int>& vec)
{
    for (int i = 1; i < vec.size(); ++i)
    {
        if (vec[i] < vec[i - 1])
        {
            int temp = vec[i];
            int pos = upper_bound(vec, 0, i - 1, temp);
            for (int j=i; j >pos; --j)
                vec[j] = vec[j-1];
            vec[pos] = temp;
        }
    }
}
// 希尔排序
void ShellSort(vector<int>& vec)
{
    for (int interval = 6; interval >= 1; interval /= 2)
    {
        for (int i = interval; i < vec.size(); i+=1)
        {
            if (vec[i] < vec[i - interval])
            {
                int temp = vec[i];
                int k = i - interval;
                for (; k >= 0; k -= interval)
                {
                    if (temp > vec[k])
                        break;
                    vec[k + interval] = vec[k];
                }
                vec[k += interval] = temp;
            }
        }
    }
}
// 归并排序
vector<int> v_temp;

void MergeSort(vector<int>& vec, int left, int right)
{
    if (left >= right)
        return;
    int mid = left + ((right - left) >> 1);
    MergeSort(vec, left, mid);
    MergeSort(vec, mid + 1, right);
    int p0 = left, p1 = mid + 1, i = left;
    while (p0 <= mid && p1 <= right)
    {
        if (vec[p0] < vec[p1])
            v_temp[i++] = vec[p0++];
        else
            v_temp[i++] = vec[p1++];
    }
    while (p0 <= mid)
        v_temp[i++] = vec[p0++];
    while (p1 <= right)
        v_temp[i++] = vec[p1++];
    for (int i = left; i <= right; ++i)
        vec[i] = v_temp[i];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值