C++冒牌排序-数组和指针、以及时间复杂度和空间复杂度记录

冒泡排序思想:通过两个循环对元素进行比较,并调换位置,每一趟小循环都会产生一个最大值/最小值放到最后面,然后每个小循环只对小于第一次循环的个数进行操作。

  第一步:首先看一下遍历操作,打印10*10的星号

int main()
{
    for (int i = 0; i < 10 ; i++)
    {
        for(int j = 0 ;j < 10;j++)
        {
            printf("*");
        }
        printf("\n");
    }
}

在这里插入图片描述
  第二步:从1开始,打印到10个星号
  循环体更改为:

    for (int i = 0; i < 10 ; i++)
    {
        for(int j = 0 ;j < 10 - i - 1 ;j++)
        {
            printf("*");
        }
        printf("\n");
    }

在这里插入图片描述
  普通循环体冒泡排序:
  第三步:打印出数组指向对象

int main()
{
    int a[] = {55,88,44,6,64,11,2};
    for(int i=0;i<sizeof(a)/sizeof(int);i++)
    {
        for(int j=0;j<end(a)-begin(a)-i;j++)
       {
           cout << a[j] << " ";
       }
       cout << endl;
    }
}

在这里插入图片描述
  按照从小到大排序的顺序,每一次小循环将最大的数值排列到最后。
  这里注意第二个循环的判断条件应为:

j<end(a)-begin(a)-i-1;

  因为后面还需要进行判断操作,上面只是打印出每次小循环获得的数好理解。
在这里插入图片描述

  第四步:冒泡排序代码

int main()
{
    int a[] = {55,88,44,6,64,11,2};
    for(int i=0;i<sizeof(a)/sizeof(int);i++)
    {
        for(int j=0;j<end(a)-begin(a)-i-1;j++)
       {
        if (a[j]>a[j+1])
        {
            int temp;
            temp  = a[j+1];
            a[j+1] = a[j];
            a[j] = temp;
        }
       }
    }
    for (int i = 0;i<sizeof(a)/sizeof(int);i++)
    {cout << a[i] << " ";}
}

在这里插入图片描述
  第五步:下面写一下指针版本的冒泡排序


int main()
{
    int a[] = {55,88,44,6,64,11,2};
    int* p;
    p = a;
    for(int i = 0; i < end(a)-begin(a) ; i++)
    {
        for(int j = 0 ; j < end(a)-begin(a) - i - 1 ; j++) 
        {
             if(*(p+j)>*(p+j+1))         //判断相邻元素的大小
            {
               int k = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = k;       //借助中间变量进行值传递
            }
        }
    }
    for(int i = 0;i<sizeof(a)/sizeof(int);i++)
    {cout << a[i] << " ";}
}

  奇怪,不懂C++为什么有时候会报一些神奇的错误:

tempCodeRunnerFile.cpp:1:5: error: expected unqualified-id before 'for'
    1 |     for (int i = 0; i < end(a)-begin(a) ; i++ )
      |     ^~~
tempCodeRunnerFile.cpp:1:21: error: 'i' does not name a type
    1 |     for (int i = 0; i < end(a)-begin(a) ; i++ )
      |                     ^
tempCodeRunnerFile.cpp:1:43: error: 'i' does not name a type
    1 |     for (int i = 0; i < end(a)-begin(a) ; i++ )
      |                                           ^
tempCodeRunnerFile.cpp:13:5: error: expected unqualified-id before 'for'
   13 |     for (int i = 0;i<sizeof(a)/sizeof(int);i++)
      |     ^~~
tempCodeRunnerFile.cpp:13:20: error: 'i' does not name a type
   13 |     for (int i = 0;i<sizeof(a)/sizeof(int);i++)
      |                    ^
tempCodeRunnerFile.cpp:13:44: error: 'i' does not name a type
   13 |     for (int i = 0;i<sizeof(a)/sizeof(int);i++)
      |                                            ^

[Done] exited with code=1 in 0.271 seconds

  这个错误在重新输入代码和调整下位置之后又消失了,推测可能是因为对内存操作了的原因。

  时间复杂度:
  最优情况在于所有元素都是排列好顺序的,那么不需要进行更换的三个步骤,因此时间复杂度是遍历的时间,则为1+2+3…+(n-1) = [ n(n-1) ] / 2,所以最优时间复杂度为O(n2)。

  同时也可以在代码中添加优化,使得时间复杂度为O(n),因为排序好的元素不需要比较,设置一个flag对每个元素进行判断,因此遍历可以得到O(n)的结果,但这个对结果影响不大,平均时间复杂度还是O(n2)。

int main()
{
    int a[] = {55,88,44,6,64,11,2};
    bool flag;
    flag = false;
    for(int i=0;i<sizeof(a)/sizeof(int);i++)
    {
        for(int j=0;j<end(a)-begin(a)-i-1;j++)
       {
        if (a[j]>a[j+1])
        {
            int temp;
            temp  = a[j+1];
            a[j+1] = a[j];
            a[j] = temp;
            flag = true;
        }
     }
     if(flag == false)
     return;
    }
    for (int i = 0;i<sizeof(a)/sizeof(int);i++)
    {cout << a[i] << " ";}
}

  最坏情况是所有元素逆序排序,因此要做上述代码中更换元素的三个步骤,所以为3*[ n(n-1) ] / 2,为[ 3n(n-1) ] / 2,最坏时间复杂度也为O(n2)。
  因此平均时间复杂度为O(n2)。

  空间复杂度:交换变量时临时占据的空间大小
  最优空间复杂度为所有元素排序正确,不需要临时存储,为0;
  最差空间复杂度为所有元素逆序排序,每个元素都需要一个存储空间,则空间复杂度为O(n);
  平均空间复杂度为O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: tempcoderunnerfile是一个临时的代码运行文件,通常用于在编写代码时进行测试和调试。它可以帮助程序员快速验证代码的正确性,以及发现和解决潜在的问题。在完成测试和调试后,这个临时文件通常会被删除或清除,以避免对代码库造成不必要的影响。 ### 回答2: tempcoderunnerfile是一个临时的代码运行文件。在编程中,我们常常需要测试一小段代码的运行结果,或者尝试一些新的代码片段。而临时代码运行文件就是为这种情况而设计的。 临时代码运行文件的作用主要有两个:一是方便调试和测试代码。我们可以在其中输入一小段代码,然后立即运行并查看结果,从而快速检查代码是否正确或者达到预期效果。这可以帮助我们快速定位问题并进行调试。二是作为一个代码片段的临时储存空间。有时候我们会需要尝试一些新的代码,或者编写一些小功能,但并不想为它们创建一个完整的项目或文件。这时候,临时代码运行文件可以充当一个临时储存的容器,方便我们写入和运行代码。 临时代码运行文件通常具备一些基本的功能,比如代码输入窗口,运行按钮以及输出结果窗口。我们可以在输入窗口中编写代码,然后点击运行按钮,系统会立即编译和运行我们的代码,并将结果显示在输出窗口中。有些临时代码运行文件还提供了代码高亮和语法错误提示等功能,以帮助我们更好地编写和修改代码。 总之,tempcoderunnerfile是一个临时的代码运行文件,它可以方便我们调试和测试一小段代码的运行结果,并且可以作为临时储存代码片段的容器。 ### 回答3: tempcoderunnerfile是一个临时的代码运行文件。在编写、测试或者运行代码的过程中,我们经常需要创建一些临时文件来存储代码或者记录运行结果。这些临时文件通常被称为tempcoderunnerfile。 tempcoderunnerfile通常有以下几个特点: 1. 临时性:tempcoderunnerfile只在特定的时间范围内存在,一旦不再需要,就会被删除或者覆盖。 2. 功能性:tempcoderunnerfile用于存储代码或者运行结果,方便开发人员查看、修改或者测试代码。 3. 适应性:tempcoderunnerfile可以用于不同的编程语言和开发环境。无论是Java、Python、C++还是JavaScript,都可以使用tempcoderunnerfile进行代码运行。 举个例子,当我们在编写一个Python脚本时,可以使用tempcoderunnerfile存储我们的源代码,然后通过运行tempcoderunnerfile来验证代码的正确性。此外,当我们在调试代码时,也可以将调试信息输出到tempcoderunnerfile中,以便更好地分析问题。 总之,tempcoderunnerfile在开发过程中扮演着非常重要的角色。它不仅方便了代码编写、修改和测试,而且还提供了存储运行结果的功能,为我们解决问题提供了帮助。虽然它很小,但它在编程中的作用却是不可忽视的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

面条有点辣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值