常用排序算法实现

#include "main.h"
#include<iostream>
#include<string>
using namespace std;
void merge(int a[], int L, int M, int R);
void printNum(int arr[], int len, string flag)
{
    cout <<"********" << flag <<"*******" << endl;
    for (int i = 0; i < len; i++)
        cout << arr[i]<<" ";
    cout << endl;
    cout << "*************************" << endl;
}
void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}
/****冒泡排序实现*************
1.外层i循环n-1次,这是控制循环次数的。
2.内层j,j对应的实际下标,循环n-i-1次,
    -i是因为每次循环完后最后一位就排好序了,对应为n-i次。
    -1是因为要取到j+1的值。
******************************/
void bubbleSort(int a[], int len) {
    for (int i = 0; i < len - 1; i++)
    {
        int flag = 0;
        for (int j = 0; j < len - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                flag = 1;
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
        if (flag == 0)
            break;
    }
}
/*选择排序实现
1.外层i循环n-1次,这是控制循环次数的。
2.内层j,j对应的实际下标,循环n-i次,
    -i是因为每次循环完后最后一位就排好序了,对应为n-i次。
******************************/
void selectSort(int a[], int len) {
    for (int i = 0; i < len - 1; i++)
    {
        int maxtmp = 0;
        for (int j = 0; j < len - i ; j++)
        {
            if (a[j] > a[maxtmp])
            {
                maxtmp = j;
            }
        }

        swap(a[maxtmp],a[len-i-1]);

    }
}
/*插入排序*
    1.外层i循环n-1次,这是由于每次排序相当于把一个数插入一个已排好序的数组,所以下标从1到结束。
    2.将已排好序的数组从后往前依次与要插入的数比较,当比要插入的数大时就往后移位。
********************************/
void insertSort(int a[], int len)
{

        for (int j = 1; j < len; j++)
        {
            int tmp = a[j];
            int k = j;
            while (k > 0 && tmp < a[k - 1])
            {
                a[k] = a[k-1];
                k--;
            }
            a[k] = tmp;
        }
}

/**快排的思想是找到中间值,
    然后左边从左往右找到比中间值大的值
    然后右边从右往左找比中间值小的值
    交换左右两边的值
    取左边界到右边找到值的区间再次递归调用
    取左边找到值到右边界的区间再次递归调用*/
void quicksort(int a[], int L, int R)
{
    int i = L;
    int j = R;
    int mout = a[L / 2 + R / 2];
    while (i <= j) {
        while (mout > a[i]) {
            i++;
        }
        while (mout < a[j]) {
            j--;
        }
        if (i <= j) {
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
            i++;
            j--;
        }
    }
    if (L < j) {
        quicksort(a,L,j);
    }
    if (i < R) {
        quicksort(a, i, R);
    }


}
/**
    归并排序:开始于将两个有序数组合并成一个
    当然数据不可能是有序的,所以在归并时使用递归将数组划分,然后每轮递归
**/
void mergsort(int a[],int L,int R)
{
    if(L==R)
    {
        return;
    }
    else
    {
        int mid = (L / 2 + R / 2);
        mergsort(a,L,mid);
        mergsort(a,mid+1,R);
        merge(a,L,mid+1,R);

    }
}


void merge(int a[], int L, int M, int R)
{
    int* lifta = new int[M-L];
    int* righta = new int[R-M+1];

    for (int i = L; i < M; i++)
    {
        lifta[i-L] = a[i];
    }
    for (int i = M; i <= R; i++)
    {
        righta[i - M] = a[i];
    }

    int i = 0;
    int j = 0;
    int k = L;

    while (i < (M - L) && j < (R - M + 1))
    {
        if (lifta[i] < righta[j])
        {
            a[k++] = lifta[i++];
        }
        else
        {
            a[k++] = righta[j++];
        }
    }
    while (i < (M - L))
    {
        a[k++] = lifta[i++];
    }

    while (j < (R - M + 1))
    {
        a[k++] = righta[j++];
    }
    delete lifta, righta;
}

/**希尔排序
    插入排序的一种形式采用的是元素间下标隔断递增的形式进行插入操作
**/
void shellsort(int a[], int len)
{
    for (int step = len / 2; step > 0; step /= 2)
    {
        for (int i = step; i < len; i++)
        {
            int j = i;
            int tmp = a[j];
            while (j >= step && a[j - step] > tmp)
            {
                a[j] = a[j - step];
                j -= step;
            }
            a[j] = tmp;
        }
    }

}
/****堆排序  先说清楚,完全没看明白  一度对自己的智商产生了怀疑  于是决定先把代码敲了****/
void adjust(int a[], int idx1, int idx2)
{
    if (nullptr == a || idx1 >= idx2 || idx1 < 0 || idx2 < 0)
        return;
    int tmp = a[idx1];//存放暂时要调整的数据
    for (int idx = idx1 * 2 + 1; idx <= idx2; idx = idx * 2 + 1)//从要调整的数据的左孩子开始比较
    {
        //选出左右孩子中的最大节点
        if(idx + 1 <= idx2 && a[idx] < a[idx + 1])
            ++idx;
        if (a[idx] > tmp)
        {
            a[idx1] = a[idx];
            idx1 = idx;
        }
        else
        {
            break;
        }
    }
    a[idx1] = tmp;
}
void headSort(int a[], int len)
{
    if (nullptr == a || len <= 0)
        return;
    //数组中顺序存放的数据对应完全二叉树堆中的对应节点的值,现在调整为大根堆
    for (int i = len / 2 - 1; i >= 0; i--)//由于堆结构构造的特殊性,(len/2-1就是表示最后一个非叶子节点)从最后一个非叶子节点调整为最大堆
    {
        adjust(a,i,len-1);//最后一个非叶子节点和它的孩子比较调整
    }
    //排序,根节点和最后一个节点交换,调整
    for (int i = len - 1; i > 0; --i)
    {
        swap(a[0],a[i]);//每次选出一个最大的数放到末尾,也就是数组末尾
        adjust(a,0,i-1);
    }
    return ;
}
//测试
int main(void) {
    int girl[] = { 21,32,17,33,20,34,28,27,1 };
    int len = sizeof(girl) / sizeof(girl[0]);
    printNum(girl, len, "排序前");
    headSort(girl, len);
    printNum(girl, len, "排序后");
    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值