黑马程序员 C语言-----数组基本概念 以及选择 冒泡排序理解

时间:2021-09-14 00:27:12

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------                        


        数组基本概念

      变量类型 变量名;

     元素类型 数组名[元素个数]; // 数组中保存的每一个数据,我们称之为元素

     特点:数组只能存放同一种数据类型

     数组中的每一个元素都有一个索引号,索引号从0开始

     部分初始化, 没有赋值的元素默认是0

    int scores[3];

    scores[0] = 55;

    scores[1] = 66;

    scores[2] = 77;

    int v1 = scores[0];

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

输出结果就是 55


     数组[]中的元素个数只能写整型常量,以及返回值是整型常量的表达式

    int scores6[10.1] = {1, 3};//这个就是错误的  元素个数只能是整型常量

    int scores7[1 + 1] = {1, 3};//返回值是整型常量的表达式


    通过变量定义数组,如果没有对数组进行初始化,里面存放的是一些垃圾数据(随机值)

    在定义数组的同时进行初始化,可以省略元素个数,会自动的计算出数组元素的个数

       例如    int scores[] = {1,3};

要想给数组一次性赋值(给数组中所有的元素赋值)只能在定义数组的同时,

如果定义完数组之后,就不能再对数组进行一次性的赋值

        int scores13[3];

        scores13 =  {1, 3, 5};// 错误写法


                   int scores13[3]={1, 3, 5}//正确写法

数组的地址就是它第0个元素的地址,数组名就是数组的地址

           &cs == &cs[0] == cs

数组元素存放值是从小到大, 而每一个元素存值又是从大到小

因为内存寻址从大到小,所以先定义的数组的地址比后定义的地址大

基本数据类型作位函数参数是值传递

数组作为函数参数传递的是地址

当数组作为函数参数传递的时候,可以省略[]中的元素个数

当数组作为函数参数传递的时候,会自动转换成"指针类型"

而指针在当前操作系统mac 下占用8个字节

 想在函数中动态计算数组的元素个数是不行的,因为指针类型占8个字节

实例:遍历数组

    int ages[3] = {11,25,27};

    int length =sizeof(ages) /sizeof(ages[0]);

    for (int i =0; i < length; i++) {

       printf("ages[%d] = %d\n", i, ages[i]);

   }

>. 选择排序原理:依次选择数组中过的每一个元素和其他元素进行比较

  当内循环执行完一次(比较完一次), 最值出现在头角标上

例如   要求从键盘输入40~2000的数值,排序后输出

#include <stdio.h>

void printArray(int array[],int length)

{

   for (int i =0; i < length; i++) {

        printf("array[%d] = %d\n", i, array[i]);

    }

}


void swap(int array[],int i,int j)

{

       int temp = array[i];

        array[i] = array[j];

        array[j] = temp;

}


int main(int argc,constchar * argv[])

{

   int nums[4] = {1000,500,1,5};

   int length =sizeof(nums) /sizeof(nums[0]);

    printArray(nums, length);

//     -1是因为最后一个元素已经不用比较了

   for (int i =0; i <4 - 1; i++) {

       for (int j = i +1; j <4; j++) {

            

           if (nums[i] > nums[j]) {

                swap(nums, i, j);

            }

        }

    }

    printArray(nums, length);

   return0;

}


>.冒泡排序原理: 冒泡排序是拿相邻的两个元素进行比较 

 特点: 内循环执行完一次(完整的比较完一次),最值出现在尾角标上

#include <stdio.h>

void printArray(int array[],int length)

{

   for (int i =0; i < length; i++) {

        printf("array[%d] = %d\n", i, array[i]);

    }

}

void swap(int array[], int i, int j)

{

        int temp = array[i];

        array[i] = array[j];

        array[j] = temp;

}

int main(int argc, const char * argv[])

{

    int nums[4] = {1000,50015};

    int length = sizeof(nums) / sizeof(nums[0]);

    printArray(nums, length);

    for (int i =0; i <4; i++) {

//         -1是为了防止角标越界

//        -i 是为了每一次内循环少比较一个

       for (int j =0; j <4 - 1 - i; j++) {

//            printf("j = %d, j+1 = %d\n", j, j + 1);

           if (nums[j] > nums[j+1]) {

                swap(nums, j, j+1);

            }

        }

    }

    printArray(nums,  length);

    

   return0;

}



  二维数组

     元素类型 数组名[元素个数];

     元素类型: 说明将来数组中存放元素的类型

     元素个数: 说明将来数组中能存放多少个元素

     

     元素类型 数组名[行数][列数];

     元素类型 数组名[有多少个一维数组][每一个一维数组的元素个数];

     二维数组本质依然是一个一维数组, 只不过他的每一个元素又是一个一维数组而已

     二维数组可以省略行数,会自动根据初始化的值计算出有多少个一维数组

 注意:二维数组不能省略列数,必须明确的告诉二维数组中每一个一维数组可以存放多少个元素

要给二维数组进行一次性的赋值,只能在定义二维数组的时候

      折半查找

注意点:折半查找被查找的数组必须是有序的

 查表法写法

void printHex(int num)

{

    1.定义一个数组作为取出的八进制的结果查询的表

    char cs[] = {'0', '1', '2', '3', '4', '5',

                 '6', '7', '8', '9',

                  'a', 'b', 'c', 'd', 'e', 'f'};

    2.定义一个数组,用于保存查询后的结果

    char rs[8] = {0};

    3.定义变量存储结果的索引,指向了结果数组的最大下标

    int pos = sizeof(rs) / sizeof(rs[0]); // 8

    while (num != 0) {

       取出num的最低4

        int index = num & 15;

       把取出的值当作索引取结果数组中查询

        char c = cs[index];

       把查询出来的结果保存到数组中

        rs[--pos] = c;

       右移4,方便下一次取值

        num = num >> 4;

    }

    for (int i = pos; i < 8; i++) {

        printf("%c", rs[i]);

    }

    printf("\n");

    

}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------