C++ 基础算法源码及解析

本文详细介绍了冒泡排序、选择排序、插入排序以及希尔排序的C++实现,通过示例代码展示了这些基础排序算法的工作原理和步骤。
摘要由CSDN通过智能技术生成

冒泡排序:

两两比较,较大的往后,较小的往前。

void BubbleSorting(std::vector<int>& testdata)//冒泡排序,从小到大;
{
    int nSize = testdata.size();
    if(nSize  < = 1)
        return;
    int tmp,nex;
    for(int i = 0;i<nSize-1;i++)//遍历size-1遍
    {
        nex = 0;//设定一个初始的值,为第一个数
        for(int j = 1;j<(nSize - i);j++)//完成一遍以后应该保证最大值,放在了最后面;
        {
            if(testdata[nex] > testdata[j])//如果选定的值大于后面的值,就将选定值于后面的值进行交换
            {
                tmp = testdata[j]; //交换选定值和比较值
                testdata[j] = testdata[nex];
                testdata[nex] = tmp;
            }
            nex = j;//选定值的序号也进行更新
        }  
    }
}

选择排序:

不断地从未排序的部分筛选出最大值和最小值,(可以只筛选一个最值)

void BubbleSorting(std::vector<int>& testdata)
{
    int nSize = testdata.size();//获取数组大小
    if(nSize <= 1)
        return;
    int minnex,maxnex,min,max;//定义最大最小值的临时变量,和最大最小值的角标记录变量
    for(int i = 0;i <nSize / 2;i++)//循环总大小一半就好,奇数偶数不用考虑
    {
        min = testdata[i];//最小值初始值从左往右
        max = testdata[nSize - 1 -i];//最大值初始值从右往左
        for(int j = i; j<nSize -i;j++)//找到最大值和最小值,并记录角标
        {
            if(min >= testdata[j])
            {
                min = testdata[j];
                maxnex = j;
            }
            else if(max <= testdata[j])
            {
                max = testdata[j];
                maxnex = j;
            }
        } 
        //将最大值和最小值分别与最左侧和最右侧的值进行交换
        testdata[minnex] = testdata[i];
        testdata[i] = min;
        testdata[maxnex] = testdata[nSize -1 -i];
        testdata[nSize -1 -i] = max;
    }
}

插入排序:从第二个值开始,分别与前面的所有值进行比较,并插入到他应该在的位置上(即保证该值之前的序列排列顺序满足要求)

void InsertSorting(std::vector<int>& testdata)
{
    int nSize = testdata.size();//获取数组总大小
    if(nSize <= 1)
        return;
    int tmp;

    //使用vector的插入和删除功能
    //for(int i =1;i<nSize;i++)
    //{
    //    for(int j = i-1;j >=0;j--)
    //        {   
    //            if(testdata[i]>testdata[j])               //如果前面的值比该值小
    //            {
    //                tmp = testdata[i];                    //选定指定值
    //                testdata.erase(testdata.begin() +i);  //销毁指定值
    //                testdata.insert(testdata.begin() + j + 1,tmp);//插入指定值到小于指定值的后面
    //                break;
    //            }
    //            if(j == 0)                                //如果已经移动到了最前面,就插入到最前面
    //            {
    //                tmp = testdata[i];
    //                testdata.erase(testdata.begin() +i);
    //                testdata.insert(testdata.begin() + j,tmp);
    //            }
    //        }
    //        
    //}
    
    for(int i = 1; i<nSize;i++)//从第二个遍历到最后
    {
        if(testdata[i-1]>testdata[i])//如果前一个比选定的值大
        {
            tmp = testdata[i];//将选定的值记录到缓存
            int j = i-1;//将比缓存中大的值,都向后移动一个位置
            do{
                testdata[j+1] = testdata[j];
                j--;
             }while(j>=0 && testdata[j]>tmp);
             testdata[j+1] = tmp;//将缓存值放入空出来的位置
        }
    }
    
}

希尔排序:插入排序的改进版本,首先将原数组平均分为两组,对每组分别进行排序;排序规则为每组再均分为两组,直到分为总共size组,在两两组合,进行插入排序

void ShellSorting(std::vector<int>& testData)
{
    int nSize = testdata.size();
    if(nSize<=1)    return;
    int incre = nSize;
    int tmp;

    do
    {
        incre = incre / 3 + 1;            //初始化划分量
        for(int i = incre; i<nSize;i++)
        {
            if(testdata[i - incre] > testdata[i]) //插入排序
            {
                tmp = testdata[i];
                int j = i- incre;
                do{
                    testdata[ j + incre] = testdata[j];
                    j -= incre;
                }while(j >= 0 &&testdata[j] > tmp);
                testdata[j+incre] = tmp;
            }
        }
    }while(incre >1)


    //下面算法也是能够取得正确的排序结果,但是方法上面好像有问题
    //int incre = i / 3 + 1; //从第二个序列开始,对每组进行插入排序
    //for(; incre > 0;incre = incre/3)
    //{
        //for(int preIndex = k - incre; preIndex >0 && testdata[preIndex + incre] <testdata[preIndex];pre = preIndex - incre)
        //{
            //tmp = testdata[preIndex + incre];
            //testdata[preIndex + incre] = testdata[preIndex];
            //testdata[preIndex] = tmp;
        //}
    //}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值