四、数组
冒泡排序
两两比较,第 j 个和 j+1 个比较
int a[5] = {5, 4, 3, 2, 1};
第一轮:i = 0 n:n个数,比较 n-1-i 次
4 5 3 2 1 // 第一次比较 j = 0
4 3 5 2 1 // 第二次比较 j = 1
4 3 2 5 1 // 第三次比较 j = 2
4 3 2 1 5 // 第四次比较 j = 3
第二轮:i = 1 n-1-i 次
3 4 2 1 5 // 第一次比较 j = 0
3 2 4 1 5 // 第二次比较 j = 1
3 2 1 4 5 // 第三次比较 j = 2
第三轮:i = 2 n-1-i 次
2 3 1 4 5 // 第一次比较 j = 0
2 1 3 4 5 // 第二次比较 j = 1
第四轮:i = 3 n-1-i 次
1 2 3 4 5 // 第一次比较 j = 0
#include <stdio.h>
#define N 5int main ()
{int temp, i, j;int arr[N] = {5, 4, 3, 2, 1};for (i = 0; i < N-1; i++){for (j = 0 ; j < N-1-i; j++){if (arr[j] > arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for (i = 0; i < 5; i++){printf("%-4d", arr[i]);}printf ("\n");return 0;
}
选择排序
n 个数:先找出最小的值下标暂存,选择出最小的值与 arr [i] 交换
排序过程:
1、首先通过n-1次比较,从n个数中找出最小值的下标,将它与第一个数交换,第一轮选择排序,结果最小值,被放在第一个元素的位置上
2、通过n-2次比较,从剩余的n-1个数中找到最小值的下标做记录,将它与第二个元素交换
3、重复这个过程,共经过n-1论排序后,排序结束
#include <stdio.h>
#define N 5int main ()
{int i, k, j, t, b;int a[N] = {1, 2, 3, 4, 5};for (i = 0; i < N-1; i++){k = i;for (j = i+1; j < N; j++){if ( a[k] < a[j]){k = j;}}if ( i != k){t = a[i];a[i] = a[k];a[k] = t;}}for (i = 0; i < N; i++){printf("%-4d", a[i]);}printf ("\n");return 0;
}
4、二维数组
1、格式
存储类型 数据类型 数组名[行数][列数];
int a[2][3];
2、访问元素
数组名[行下标][列下标];(下标从0开始)
a[0][0]:第一行第一列的元素
a[1][2]:第二行第三列的元素
注意:行下标和列下标都不能越界
行数可以省略,列数不能省略
int a[][3] = {1, 2, 3, 4, 5, 6};
3、二维数组的元素个数
1)行数 * 列数
2)sizeof(数组名)/sizeof(数据类型)
4、二维数组的大小
sizeof(数组名)
数据类型的大小 * 行数 * 列数
5、数组名
a:第一行首地址
a+1:第二行首地址
a+n:第 n+1 行首地址
6、初始化
1)全部初始化
int a[2][3] = {1, 2, 3, 4, 5, 6}; // 顺序赋值
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
}; // 按行赋值
2)部分初始化
未被初始化的元素值为0
int a[2][3] = {1, 2, 3, 4}; // 顺序赋值
int a[2][3] = {{1, 2}, {4, 5}} // 按行赋值
3)未初始化
随机值,需要单独赋值
int a[2][3];
7、内存分配
a是行地址,a[0]是列地址
a:第一行首地址
a+1:第二行首地址
a[0]:第一行第一列的地址
a[0]+1:第一行第二列的地址
a[1]:第二行第一列的地址
a[1]+1:第二行第二列的地址
8、二维数组遍历
for循环嵌套,外层行数,内层列数
int a[m][n] = {};for(int i = 0; i < m; i++)
{for(int j = 0; j < n; j++){scanf();printf();}
}