1. 数组
#include <stdio.h>
int main()
{
int arr[10];
printf("sizeof(arr) = %d\n", sizeof(arr));
printf("arr = %p &arr[0] = %p\n", arr, &arr[0]);
printf("%d %d\n", arr[1], 1[arr]);
printf("%d %d\n", *(arr + 1), *(1+arr));
return 0;
}
1.1. 数组三要素
起始位置,移步位置,终止位置(范围)
1.2. 变长数组
#include <stdio.h>
int main()
{
int size = 5;
int array[size]; // 变长数组不能被初始化 = {1,2,3,4,5};
printf("sizeof(array) = %d\n", sizeof(array));
size = 15; // 此时再改变size的值,数组的大小,不再发生改变
printf("sizeof(array) = %d\n", sizeof(array));
return 0;
}
变长数组:用整形变量或表达式声明或定义的数组,变长数组在生存期内的长度是固定的。
2. 数组的排序
排序是查找的前提
选择排序:
int main()
{
int array[10] = {100, 1, 40, 29, 45, 22, 98, 2, 83, 75};
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
int tmp;
if (array[i] > array[j])
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", array[i]);
}
return 0;
}
优化算法:比而不换,只记下标
int main()
{
int array[10] = {100, 1, 40, 29, 45, 22, 98, 2, 83, 75};
int tmp;
for (int i = 0; i < 9; i++)
{
int idx = i; // 假设当前元素是最小的
for (int j = i + 1; j < 10; j++)
{
if (array[idx] > array[j])
{
idx = j; // 有比当前元素小的,更新最小下标,直到循环结束
}
}
if (i != idx)
{ // idx == i说明假设成立,当前最小,进入下一轮
tmp = array[i];
array[i] = array[idx];
array[idx] = tmp;
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", array[i]);
}
return 0;
}
3. 查找
线性查找:查找到第一个匹配的元素即刻返回
折半查找(二分查找):前提:查找表的数据是线性结构保存的,还要求查找表中的数据由小到大有序排列
int main()
{
int array[10] = {1, 2, 22, 29, 40, 45, 75, 83, 98, 100};
int find = 83;
int idx = -1;
int low = 0;
int high = sizeof(array) / sizeof(array[0]) - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (find == array[mid])
{
idx = mid;
break;
}
if (find > array[mid])
low = mid + 1;
else
high = mid - 1;
}
if (idx == -1)
printf("not found\n");
else
printf("found %d\n", idx);
return 0;
}