排序算法C++

本文介绍了C++中各种排序算法,包括全排列的字典序算法、递归和迭代版本,以及归并排序、快速排序、选择排序、希尔排序和堆排序。此外,还有模板函数swapitem和printitem的使用,展示了选择排序和插入排序的具体实现。

Mysort.h

#pragma once
#include "pch.h"

//全排列字典序算法
void Allsortdic(vector<char> &a);

//全排列 递归写法,只能处理不包含重复元素的序列
void AllsortRecursion(vector<char>& a);

//归并排序 递归写法
void MergeSort_Recursion(vector<string> &a);

//归并排序-迭代写法
void MergeSort_Iterative(vector<string> &a);

//插入排序
void InsertSort(vector<string> &a);

//快速排序 递归写法
void QuickSort_Recursion(vector<string> &a);

//选择排序
void SelectSort(vector<string>& a);

//希尔排序
void ShellSort(vector<string> &a);

//堆排序
void HeapSort(vector<string> &a);

Mysort.cpp

#include "pch.h"
#include "MySort.h"



template<typename T>
void swapitem(vector<T> &a, int i, int j)
{
    if (i == j)
    {
        return;
    }
    T temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

template<typename T>
void printitem(vector<T> &a)
{
    for (size_t i = 0; i < a.size(); i++)
    {
        cout << a[i];
    }
    cout << endl;
}


//选择排序
void SelectSort(vector<string>& a)
{
    size_t length = a.size();
    for (size_t i = 0; i < length; i++)
    {
        size_t min = i;
        for (size_t j = i + 1; j < length; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        swapitem(a, i, min);
    }
}

//插入排序
void InsertSort(vector<string> &a)
{
    size_t length = a.size();
    for (size_t i = 1; i < length; i++)
    {
        for (size_t j = i; j >= 1; j--)
        {
            if (a[j] < a[j - 1])
            {
                swapitem(a, j, j - 1);
            }
        }
    }
}

//希尔排序
void ShellSort(vector<string> &a)
{
    int length = a.size();
    int h = 1;
    while (h < length / 3)
    {
        h = 3 * h + 1;
    }

    while (h >= 1)
    {
        for (size_t i = h; i < length; i++)
        {
            for (size_t j = i; j >= h; j -= h)
            {
                if (a[j] < a[j - h])
                {
                    swapitem(a, j, j - h);
                }
            }
        }
        h = h / 3;
    }

}



//归并排序-递归写法
void merge(vector<string> &a, int lo, int mid, int hi, vector<string> &temp)
{
    int i = lo;
    int j = mid + 1;

    for (int k = lo; k <= hi; k++)
    {
        temp[k] = a[k];
    }

    for (int k = lo; k <= hi; k++)
    {
        if (i > mid)
        {
            a[k] = temp[j++];
        }
        else if (j > hi)
        {
            a[k] = temp[i++];
        }
        else if (temp[i] < temp[j])
        {
            a[k] = temp[i++];
        }
        else
        {
            a[k] = temp[j++];
        }
    }
}
void DoMergeSort(vector<string> &a, int lo, int hi, vector<string> &temp)
{
    if (lo >= hi)
    {
        return;
    }
    int mid = lo + (hi - lo) / 2;
    DoMergeSort(a, lo, mid, temp);
    DoMergeSort(a, mid + 1, hi, temp);
    merge(a, lo, mid, hi, temp);
}
//归并排序-递归写法
void MergeSort_Recursion(vector<string> &a)
{
    vector<string> temp(a);
    DoMergeSort(a, 0, a.size() - 1, temp);
}

//归并排序-迭代写法
void MergeSort_Iterative(vector<string> &a)
{
    int length = a.size();
    vector<string> temp(a);
    for (int sz = 1; sz < length; sz = sz + sz)
    {
        for (int lo = 0; lo < length - sz; lo += sz + sz)
        {
            merge(a, lo, lo + sz - 1, min(lo + sz + sz - 1, length - 1), temp);
        }
    }
}

//快速排序-递归写法
int partition(vector<string> &a, int lo, int hi)
{
    int i = lo + 1;
    int j = hi;
    while (true)
    {
        while (i <= hi && a[i] < a[lo])
        {
            i++;
        }
        while (j >= lo && a[j] > a[lo])
        {
            j--;
        }
        if (i < j)
        {
            swapitem(a, i, j);
            i++;
            j--;
        }
        else
        {
            break;
        }
    }
    swapitem(a, lo, j);
    return j;
}

void sortq(vector<string> &a, int lo, int hi)
{
    if (lo >= hi)
    {
        return;
    }
    int j = partition(a, lo, hi);
    sortq(a, lo, j - 1);
    sortq(a, j + 1, hi);
}


//快速排序 递归写法
void QuickSort_Recursion(vector<string> &a)
{
    sortq(a, 0, a.size() - 1);
}

//只能处理不包含重复元素的序列
void allsort_simple(vector<char>& a, int begin)
{
    int end = a.size() - 1;
    if (begin >= end)
    {
        for (size_t i = 0; i < a.size(); i++)
        {
            cout << a[i];
        }
        cout << endl;
        return;
    }
    for (size_t i = begin; i <= end; i++)
    {
        swapitem(a, begin, i);
        allsort_simple(a, begin + 1);
        swapitem(a, begin, i);
    }
}

//全排列-递归写法,只能处理不包含重复元素的序列
void AllsortRecursion(vector<char>& a)
{
    allsort_simple(a, 0);
}

//全排列字典序算法
void Allsortdic(vector<char> &a)
{
    sort(a.begin(), a.end());
    printitem(a);
    while (true)
    {
        //从右向左查询第一个左边<右边的位置
        int index = 0;
        int j = a.size() - 2;
        while (j >= 0)
        {
            if (a[j] < a[j + 1])
            {
                index = j;
                break;
            }
            else
            {
                j--;
            }
        }
        if (j < 0)
        {
            return;
        }

        //从右向左查询第一个比index位置大的元素
        j = a.size() - 1;
        while (j >= 0)
        {
            if (a[j] > a[index])
            {
                break;
            }
            else
            {
                j--;
            }
        }
        swapitem(a, index, j);
        reverse(a.begin() + index + 1, a.end());

        printitem(a);
    }

}


//上浮
void swim(vector<string> &a, int k)
{
    while (k > 1 && (a[k] > a[k / 2]))
    {
       swapitem(a, k, k / 2);
       k = k / 2;
    }
}

//下沉,N:数据个数
void sink(vector<string> &a, int k, int N)
{
    int len = N + 1;
    while (k < len)
    {
        int j = 2 * k;
        if ((2 * k >= len) || (2 * k + 1 >= len))
        {
            break;
        }
        
        if ((2 * k + 1 < len) && (a[2 * k] < a[2 * k + 1]))
        {
            j++;
        }

        if (a[k] < a[j])
        {
            swapitem(a, k, j);
        }

        k = j;
    }
}

//假设0索引不保存数据
void DoHeapSort(vector<string> &a)
{
    int len = a.size();

    for (size_t i = len-1/2; i >= 1; i--)
    {
        sink(a, i, len-1);
    }
    int j = len - 1;
    while (j > 1)
    {
        swapitem(a, 1, j);
        j--;
        sink(a, 1, j);
    }
}

//堆排序
void HeapSort(vector<string> &a)
{
    a.insert(a.begin(), "");
    DoHeapSort(a);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值