【数据结构与算法】基础排序

目录

一 二分查找

一 思维导图

二 实例

二 冒泡与快速

一 冒泡排序

二 快速排序

三 插入与希尔

一 插入排序

二 希尔排序

四 基数排序

五 归并排序

一 思维导图

二 实例

四 选择排序


一 二分查找

一 实例

template<typename Type>
int Binary_Search(Type* arr, int size, Type target)
{
    Type* myArr = Insert_Sort(arr, size);
    int right = size -1, left = 0, mid = 0;
    while (left <= right)
    {
        mid = left +((right - left) >> 1);
        if (arr[mid] = target)
            return mid + 1;
        if (arr[mid] > target)
            right = mid - 1;
        else
            left = mid + 1;
    }
    return -1;
}

二 冒泡与快速

一 冒泡排序

template<typename Type>
void Bubble_Sort(Type arr[], int size)
{
    Type temp;
    int j;
    for (int i = 0; i < size - 1; ++i)
    {
        for (j = 0; j < size - i - 1; ++j)
        {
            if (arr[j] < arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

二 快速排序

template<typename Type>
void LoopBody(Type* arr, int Left, int Right);
template<typename Type>
void Quick_Down(Type* arr, int size)
{
    LoopBody(arr, 0, size - 1);
}
template<typename Type>
void LoopBody(Type* arr, int Left, int Right)
{
    //1 标杆
    Type mark = arr[Right];
    //2 游标
    int left = Left;
    int right = Right - 1;
    //3 结束条件
    if (Left >= Right)
        return;
    //4 划分左右区间
    Type temp;
    while (left <= right)
    {
        while (left <= right && arr[left] >= mark)
        {
            ++left;
        }
        while (left <= right && arr[right] <= mark)
        {
            --right;
        }
        if (left < right)
        {
            temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
    //5 标杆归位
    arr[Right] = arr[left];
    arr[left] = mark;
    //6 递归左右区间
    LoopBody(arr, left + 1, Right);
    LoopBody(arr, Left, left - 1);
}

三 插入与希尔

一 插入排序

template<typename Type>
void Insert_Sort(Type arr[], int size)
{
    for (int i = 1; i < size; i++)
    {
        int j = i - 1;
        int temp = arr[i];
        for (; j >= 0; --j)
        {
            if (arr[j] > temp)
            {
                arr[j + 1] = arr[j];
            }
            else
            {
                break;
            }
        }
        arr[j + 1] = temp;
    }
}


二 希尔排序
//初级希尔排序
template<typename Type>
void Shell_Sort(Type arr[], int size)
{
    int jump = size >> 1;
    int temp, j;
    while (jump)
    {
        for (int i = jump; i < size; i++)
        {
            int j = i - jump;
            int temp = arr[i];
            for (; j >= 0; j -= jump)
            {
                if (arr[j] > temp)
                {
                    arr[j + jump] = arr[j];
                }
                else
                {
                    break;
                }
            }
            arr[j + jump] = temp;
        }
        jump >>= 1;
    }
}
//终极希尔排序
template<typename Type>
void Super_Shell(Type arr[], int size)
{
    int jump = size >> 1;
    int temp, j;
    while (jump)
    {
        for (int i = jump; i < size; ++i)
        {
            temp = arr[i];
            j = i - jump;
            for (; j >= 0 && arr[j] > temp; )
            {
                arr[j + jump] = arr[j];
                j = j - jump;
            }
            arr[j + jump] = temp;
        }
        jump = jump >> 1;
    }
}




四 基数排序
#define N 13
template<typename Type>
void Radix_Sort(Type* arr, int size)
{
    int temp[10][N] = {};
    int i, j, k;
    int index = 0;
    for (int n = 1; n < 10000; n *= 10)
    {
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < N; j++)
            {
                temp[i][j] = -1;
            }
        }
        for (j = 0; j < size; j++)
        {
            index = (arr[j] / n) % 10;
            temp[index][j] = arr[j];
        }
        k = 0;
        for (i = 0; i < 10; ++i)
        {
            for (j = 0; j < N; ++j)
            {
                if (temp[i][j] != -1)
                {
                    arr[k++] = temp[i][j];
                }
            }
        }
    }
}

五 归并排序

一 思维导图

二 实例

void Two_Merger(int arr[], int left, int mid, int right);
void _merge(int arr[], int left, int right);
void Merge_Sort(int arr[], int len)
{
    _merge(arr, 0, len - 1);
}
void _merge(int arr[], int left, int right)
{
    // 递归结束条件
    if (left >= right)
        return;
​
    int mid = ((right - left) >> 1) + left;
    //递归左右区间
    _merge(arr, left, mid);
    _merge(arr, mid + 1, right);
    //二路归并
    Two_Merger(arr, left, mid, right);
}
void Two_Merger(int arr[], int left, int mid, int right)
{
    //辅助数组
    int length = right - left + 1;
    int* pTemp = new int[length];
    //游标
    int down = left;
    int up = mid + 1;
    int index = 0;
​
    while (down <= mid && up <= right)
    {
        //左区间的元素比右区间的小 落下
        while (down <= mid && arr[down] <= arr[up])
        {
            pTemp[index] = arr[down];
            index++;
            down++;
        }
        //右区间的元素比左区间的小 落下
        while (up <= right && arr[down] > arr[up])
        {
            pTemp[index] = arr[up];
            index++;
            up++;
        }
    }
    //
    if (down <= mid)
    {
        memmove(&pTemp[index], &arr[down], sizeof(int)*(mid - down + 1));
    }
    if (up <= right)
    {
        memmove(&pTemp[index], &arr[up], sizeof(int)*(right - up + 1));
    }
    //接手辅助的数据
    memmove(&arr[left], pTemp, sizeof(int)*length);
    //释放
    delete[]pTemp;
}

四 选择排序

template<typename Type>
void Select_Sort(Type arr[], int size)
{
    int temp;
    int j;
    for (int i = size - 1; i > 0; --i)
    {
        for (j = i - 1; j >= 0; --j)
        {
            if (arr[i] > arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

维他命C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值