C++实现排序算法

本文详细探讨了C++中常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。通过实例代码解析每种排序算法的工作原理,助你深入理解C++排序算法的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#pragma once
#include<iostream>
using namespace std;

//插入排序:时间复杂度:O(lg(N^2))   空间复杂度:O(1)
//思路:将第i个元素插入到i-1个已排好序的数组中
void InsertSort(int array[], int size)
{
    int i = 0;
    int key = 0;//表示待插入位置的元素
    int end = 0;//表示第i-1个已排好序的最后一个元素
    for (i = 1; i < size; ++i)
    {
        end = i - 1;
        key = array[i];
        while (key < array[end]&&end >= 0)
        {
            array[end + 1] = array[end];
            end--;
        }
        array[end+1] = key;
    }
}

//折半查找法  对i-1个元素进行折半查找,找到第i各元素将要插入的位置
//时间复杂度为O(N^2)查找复杂度为O(nlog2(n)
void BinSort(int array[], int size)
{
    int i = 0;
    int low = 0;
    int high = 0;
    int mid = 0;
    int key = 0;
    for (i = 1; i < size; ++i)
    {
        key = array[i];
        low = 0;
        high = i - 1;
        while (low <= high)
        {
            mid = low + ((high - low) >> 2);
            if (key < array[mid])
                high = mid - 1;
            else 
                low = mid + 1;
        }
        //搬移元素
        for (int j = i; j > low; --j)
            array[j] = array[j - 1];
        array[low] = key;
    }
}


//希尔排序
//思路:1、先将N个元素划分成多个子序列,先对多个子序列进行插入排序,让整个序列接近有序
//      2、划分的序列逐渐减小,直到子序列的个数为一,此时序列才是有序的
//时间复杂度:O(n^1.5)  空间复杂度:O(1)  不稳定
void ShellSort(int array[], int size)
{
    int gap = size;
    int i = 0;
    int key = 0;//表示待插入位置的元素
    int end = 0;//表示第i-1个已排好序的最后一个元素
    while (gap>1)
    {
        gap = gap / 3 + 1;
        for (i = gap; i < size; ++i)
        {
            end = i - gap;
            key = array[i];
            while (key < array[end] && end >= 0)
            {
                array[end + gap] = array[end];
                end -= gap;
            }
            array[end + gap] = key;
        }
    }
}

//简单选择排序   
//每一次找到最大元素的下标,然后将最大元素与最后一个元素进行替换
//时间复杂度:O(n^2)   空间复杂度为O(1)
void SelectSort(int array[], int size)
{
    for (int i = 0; i < size-1; ++i)
    {
        int Maxpos = 0;
        for (int j = 1; j < size - i; ++j)
        {
            if (array[Maxpos]<array[j])//找最大的元素的下标
                Maxpos = j;
        }

        if (Maxpos!=size-i-1)
            swap(array[Maxpos], array[size - i - 1]);
    }
}

//选择排序的优化:一趟遍历过程中同时寻找最大和最小元素
//然后将最小的放在begin位置,最大的放在end的位置
//时间复杂度:O(n^2)      
//空间复杂度:O(1)
void SelectSort1(int array[], int size)
{
        int begin = 0, end = size - 1;
        while (begin < end)
        {
            int Maxpos = begin;
            int Minpos = begin;
            int j = begin + 1;
            while (j <= end)
            {
                if (array[Maxpos]<array[j])//找最大的元素的下标
                    Maxpos = j;
                if (array[j] < array[Minpos])//找最小的元素的下标
                    Minpos = j;
                j++;
            }
            if (Maxpos != end)
                swap(array[Maxpos], array[end]);

            if (Minpos == end)
                Minpos = Maxpos;

            if (Minpos != begin)
                swap(array[Minpos], array[begin]);
            begin++;
            end--;
        }
}

//堆排序   大堆
//时间复杂度 O(nlog(n))   空间复杂度O(1)
void HeapAdjust(int array[], int size, int parent)//大堆  向下调整
{
    //默认左孩子比右孩子大
    int child = parent * 2 + 1;
    while (child < size)
    {
        //找左右孩子最大的元素
        if (child+1 < size && array[child + 1] > array[child])//右孩子大于左孩子
            child += 1;
        //用最大的孩子和其双亲进行比较
        if (array[parent] < array[child])
        {
            swap(array[parent], array[child]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
            return;
    }
}

void HeapSort(int array[], int size)
{
    //创建堆   升序---大堆    
    int root = (size - 2) >> 1;
    for (; root >= 0; --root)
        HeapAdjust(array, size, root);

    //排序:从最后一个元素一次与根节点的元素交换
    int end = size - 1;
    while (end>0)
    {
        swap(array[0], array[end]);
        HeapAdjust(array, end, 0);
        --end;
    }
}

//冒泡排序 
//思路:每一趟,两个相邻的元素进行比较,将最大的元素放在最后
//时间复杂度:O(n^2)
//空间复杂度:O(1)
void BubbleSort(int array[], int size)
{
    for (int i = 0; i < size-1; ++i)
    {
        int flag = 0;
        for (int j = 0; j < size - 1 - i; ++j)
        {
            if (array[j]>array[j + 1])
            {
                swap(array[j], array[j + 1]);
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
}

//方法一
//快速排序:先找一个基准值,将比基准值小的元素放在基准值前面
//比基准值大的元素,放在基准值后面,然后返回基准值的下标,利用递归分别对基准值两遍的元素进行排序
//时间复杂度:O(nlog(n))   空间复杂度:空间复杂度:辅助空间*调用次数O(logN)  
int Pation(int array[], int left, int right)
{
    int begin = left,end = right-1;
    int key = array[end];
    while (begin<end)
    {
        while (begin < end&&array[begin] <= key)
            begin++;
        while (begin < end&&array[end] >= key)
            end--;
        if (begin<end)
            swap(array[begin], array[end]);
    }
    if (begin<right - 1)
        swap(array[begin], array[right-1]);
    return begin;
}
//快速排序
void QuickSort(int array[], int left,int right)
{
    if (right - left > 1)
    {
        int div = Pation(array, left, right);
        QuickSort(array, left, div);
        QuickSort(array, div + 1, right);
    }
}

//方法二
//快速排序:挖坑法
//时间复杂度:O(nlog(n))   空间复杂度:空间复杂度:辅助空间*调用次数O(logN)
int Pation1(int array[], int left, int right)
{
    int begin = left, end = right - 1;
    int key = array[end];
    while (begin<end)
    {
        while (begin < end&&array[begin] <= key)
            begin++;
        if (begin < end)
        {
            array[end] = array[begin];
            end--;
        }       
        while (begin<end&&array[end]>=key)
            end--;
        if (begin < end)
        {
            array[begin] = array[end];
            begin++;
        }
    }
    array[begin] = key;
    return begin;
}
//快速排序
void QuickSort1(int array[], int left, int right)
{
    if (right - left > 1)
    {
        int div = Pation1(array, left, right);
        QuickSort1(array, left, div);
        QuickSort1(array, div + 1, right);
    }
}


//方法三  前后指针
//快速排序:
//时间复杂度:O(nlogn)  空间复杂度:辅助空间*调用次数O(logN)
int Pation2(int array[], int left, int right)
{
    int last = left-1, fast = left;
    int key = array[right-1];
    while (fast < right)
    {
        if (array[fast] < key&&++last != fast)
        {
            swap(array[fast], array[last]);
        }
        fast++;
    }
    last++;
    if (last != right)
        swap(array[last], array[right - 1]);
    return last;
}
//快速排序
void QuickSort2(int array[], int left, int right)
{
    if (right - left > 1)
    {
        int div = Pation2(array, left, right);
        QuickSort2(array, left, div);
        QuickSort2(array, div + 1, right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值