冒泡排序——“C”

简介: 冒泡排序——“C”

各位CSDN的uu们你们好呀,今天小雅兰考试了呀,考的是计算机基础,希望不大......不过这些都不是问题,这不能阻止我对C语言的热情,那现在,就让我们进入冒泡排序的世界吧,我在写数组这篇博客的时候就说过,会把冒泡排序单独拎出来讲,今天总算是要兑现这个承诺啦


往往我们在写代码的时候,会将数组作为参数传个函数。


比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。


这里首先给出一个乱序数组:


int arr[]={3,1,7,5,8,9,0,2,4,6};


排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小


冒泡排序是两两相邻的元素进行比较(这里我们来看升序)

image.jpeg这个就是小雅兰写的冒泡排序的过程啦,十个元素需要比较九次

那我们来写代码吧

我们首先肯定会这样来写

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[])
{
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  for (i = 0; i < sz; i++)//冒泡排序的趟数
  {
    int j = 0;
    for (j = 0; j < sz - i - 1; j++)//一趟冒泡排序的过程
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
  bubble_sort(arr);//是否可以正常排序呢?
  int i = 0;
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

18e87bab28af40d28fcb8e3ee1c78452.png

这可就奇了怪了,最后排序后的数组怎么是这样一个运行结果呢?这还是一个乱序数组啊,没有达到我们的预期。我们来看看究竟是怎么回事。

然后,我们就要引出我们的知识点啦

#include<stdio.h>
int main()
{
   int arr[10]={1,2,3,4,5};
   printf("%p\n",arr);
   printf("%p\n",&arr[0]);
   printf("%d\n",*arr);
   return 0;
}

d76fe5dcfb76497e8d6d87a64b0be8f8.png

我们可以发现:数组名的地址和数组首元素的地址打印出来竟然一模一样

由此我们得知:数组名是数组首元素的地址。

但是,并不是在任何情况下,数组名都是数组首元素的地址

int arr[10]={0};
printf("%d\n",sizeof(arr));

我们来运行一下,发现了不同

edf163fa53b54953929cf49dfb6e83ca.png

这个打印结果竟然是40诶


如果真是在任何情况下,数组名都是首元素的地址,那么,我们这串代码的打印结果应该是4才对啊


原来是有特殊情况的


补充:


1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。


2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。


除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。


所以,我们上面的那个冒泡排序函数些的是非常错误的。


当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。


所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。


那么,函数内部的 sizeof(arr) 结果是4。


所以,正确的冒泡排序函数该怎么写呢?

#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)//冒泡排序的趟数
  {
    int j = 0;
    for (j = 0; j < sz - i - 1; j++)//一趟冒泡排序的过程
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  bubble_sort(arr,sz);//是否可以正常排序呢?
  int i = 0;
  for (i = 0; i <sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

0dd39ee1645e40eda3e9fab080533cf8.png

这样子就非常完美啦


好啦,小雅兰今天的内容就到这里了,总算是把数组的收尾工作讲明白了,那么数组的所有知识点就告一段落了,接下来请期待小雅兰的操作符的博客噢,这段时间还是比较忙,明天上午考英语加油呀!!!(害,小雅兰的听力和口语真的好差,有点难过)

a452dd3fcbea434790f709b6ec68df33.jpg

相关文章
|
10天前
冒泡排序
冒泡排序。
19 5
|
5月前
|
算法 Java
冒泡排序就是这么容易
冒泡排序就是这么容易
25 1
|
6月前
|
搜索推荐
什么是冒泡排序
什么是冒泡排序
|
搜索推荐 算法
15 冒泡排序
15 冒泡排序
43 0
|
机器学习/深度学习 算法 搜索推荐
【c++】冒泡排序
【c++】冒泡排序
94 0