7月22日学习——关于插入排序的一些代码,以及一些时间复杂度的概念

本文介绍了在学习过程中对插入排序的理解,包括直接插入排序和折半插入排序,同时探讨了时间复杂度的概念,强调了大O表示法在评估算法效率时的作用,并通过实例解释了O(n), O(n^2)和O(logn)的时间复杂度。" 110867710,10296076,MySQL学习:从入门到3D模型存储,"['数据库', 'MySQL', 'SQL语句', '数据类型', '数据库设计']
摘要由CSDN通过智能技术生成

今天主要就是把昨天未完成的两道题完成,下午学习了一系列的插入排序。
题目7:将字符串“We Are Family!”,去除空格后打印出来。(WeAreFamily!)

#include <stdio.h>

int main()
{
    char a[100];

    printf("输入字符串:\n");
    fgets(a,100,stdin);

    char* p;
    char* t;
    int count = 0;
    int i = 0,j = 0;

    p = a;
    t = a;

    while(*p != '\0')
    {
        count++;
        p++;
    }

    for(i = 0;i <= count;i++)
    {
        if(*(t + i) != ' ')
        {
            *(t + (j++)) = *(t + i);
        }

    }

    puts(t);

    return 0;
}

题目8:输入一个字符串,判断其是否是回文。(回文:即正读和反读都一样,如abcba, abccba)

#include <stdio.h>

int main()
{
    char a[100];

    printf("输入字符串:\n");
    fgets(a,100,stdin);

    char* p = NULL;
    char* t = NULL;
    int i = 0;
    int count = 0;
    int flag;

    p = a;
    t = a;

    while(*p != '\0' && *p != '\n')
    {
        count++;
        p++;
    }

    printf("%d",count);
    printf("\n");

    while(i <= count / 2)
    {
        if(*(t + i) == *(p - i - 1))
        {
            flag = 0;
        }
        else
        {
            flag = 1;
        }

        i++;
    }

    if(flag == 0)
    {
        printf("是回文!");
    }
    else
    {
        printf("不是回文!");
    }


    printf("\n");
        
    return 0;
}


时间复杂度
概念:就我今天看书所了解的,我认为时间复杂度就是一个算法的执行次数的一个大概值,为什么说是大概值?因为时间复杂度,是你的算法语句执行的次数,当你有几个循环嵌套的时候往往它的次数就会相乘,而且其大O(也就是复杂度的表示方法)只看最高次幂,其余省略。
举几个例子

int i;
for(i = 0;i < n;i++)
{
    ……
}

这样一段循环的时间复杂度为O(n),因为循环体中代码必须要执行n次。

int i,j;
for(i = 0;i < n;i++)
{
    for(j = 0;j < n;j++)
    {
        ……
    }
}

这个就是O(n^2),这个程序它外部要循环n次,内部也要n次,这是属于平方阶的。

int count = 1;
while(count < n)
{
    count = count * 2;
}

这个时间复杂度又是多少呢?由于每次count乘以2,就距离n更近。那么就是有多少个2相乘能够超过n,则会退出循环。求2的x次方等于n中x的值,即O(logn)。

排序

直接插入

#include <stdio.h>

int main()
{
    int a[5];
    int i;                               //定义一个循环变量

    printf("输入数组元素:\n");

    for(i = 0;i < 5;i++)
    {
        scanf("%d",&a[i]);
    }
    
    printf("\n");

    int t;
    int temp;                            //作为中间量

    //从小到大
    for(i = 1;i < 5;i++)
    {
        temp = a[i];                     //设置插入值
        t = i - 1;                       //记录下标
        while((t >= 0) && (a[t] > temp))
        {
            a[t + 1] = a[t];             //将值插入
            t--;
        }
        
        a[t + 1] = temp;
    }

    //输出数组
    for(i = 0;i < 5;i++)
    {
        printf("%5d",a[i]);
    }

    printf("\n");

    return 0;
}


折半插入排序

#include <stdio.h>

void CelerityRun(int left,int right,int array[])
{
    int i,j;
    int middle,temp;
    i = left;
    j = right;
    middle = array[(left + right) / 2];   //求中间值

    do
    {
        while((array[i] < middle) && (i < right))   //从左找小于中值的数
        {
            i++;
        }

        while((array[j] > middle) && (j > left))    //从右找大于中值的数
        {
            j--;
        }

        if(i <= j)     //找到了一对值
        {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    while(i <= j);     //如果两边的下标交错,就停止(完成一次)

    //递归左半边
    if(left < j)
    {
        CelerityRun(left,j,array);
    }

    //递归右半边
    if(right > i)
    {
        CelerityRun(i,right,array);
    }
}

int main()
{
    int i;
    int a[5];
    
    printf("输入数组值:\n");
    
    for(i = 0;i < 5;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }

    //从小到大
    CelerityRun(0,4,a);

    //输出数组
    for(i = 0;i < 5;i++)
    {
        printf("%d\t",a[i]);
    }

    printf("\n");

    return 0;
}

希尔排序

#include <stdio.h>

void ShellSort(int a[],int length)
{
    int i,j;
    int temp;
    int increment = length;//increment是个增量

    do
    {
        increment = increment / 3 + 1;   //增量序列
        
        for(i = increment;i < length;i++)
        {
            if(a[i] < a[i - increment])
            {
                temp = a[i];  //暂存
                
                for(j = i - increment;j >= 0 && temp < a[j];j -= increment)
                {
                    a[j + increment] = a[j];  //记录后移,查找插入位置
                }

                a[j + increment] = temp;  //插入
            }
        }
    }
    while(increment > 1);
}
int main()
{
    int a[5];
    int i;
    int length;

    printf("输入数组:\n");
    
    for(i = 0;i < 5;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }

    printf("输入排序的个数:\n");
    scanf("%d",&length);

    //从小到大
    ShellSort(a,length);

    //输出数组
    for(i = 0;i < 5;i++)
    {
        printf("%d\t",a[i]);
    }

    printf("\n");

    return 0;
}

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值