您的位置:首页 > 编程语言 > C语言/C++

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

2014-04-02 23:04 363 查看
---------------------- <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]);

}

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

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

例如 要求从键盘输入4个0~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,500, 1, 5};

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>、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐