一维数组的定义
数组:一组具有类型相同、顺序存放的数据
ElementType name[Size];
// 数组长度Size必须是常量
数据定义的目的就是一次分配连续的N块内存(每块内存有多少字节由数据类型确定),可以用于存储N个同类型的数据。
数组名的重要意义:
数组名表示连续的N块内存的起始地址(首地址。
有了数组名(首地址)就可以找到数组中的每一个数据。
把数组名做参数传给另一个函数,则另一个函数也可以找到这个数组。
数组元素的概念及引用方法
- 数据中的每个数据称为数组元素。
- 不同的数组元素用不同的下标来区分。
- 假设有int score[30];那么30个数组元素就分 别是score[0],score[1],…score[29]。注意,此时,方括号里的数字不再表示长度,而是下标。
数组作函数参数
- 形参看似是一个数组,其实,只是一个变量,存储数组的首地址。
- 实参是主函数中的数组名,因此,传过来的就是数组首地址,只复制一个地址自然比拷贝全部数据效率高。
- 因为形参和实参都是同一处地址,所以,通过实参score找到的score[i]与通过形参a找到的a[i]实际上是同一个数组元素。对a[i]进行的一切操作实际上就是对score[i]进行操作。只是由于名称和作用域各不相同,在主函数中只能使用score,在Sum函数中只能使用a。
传数值调用和传地址调用
传数值调用:复印件被“撰改”了,原件不变
传递至调用:地址就象开启内存的钥匙,原件和复印件都可以打开同一个内存
一维数组的操作
求数组长度
int GetLength(int *arr)
{
return sizeof(arr)/sizeof(int);
}
求最大值(求最小值)
int FindMax(int *arr, int len)
{
int max_i = 0;
for (int i = 1; i < len; i++)
{
if (arr[i] > arr[max_i])
max_i = i;
}
return arr[max_i];
}
求和
int Sum(int *arr, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += arr[i];
}
return sum;
}
查找
线性查找
//函数功能:用顺序查找法在具有n个元素的数组a中查找x,返回第一次出现的下标。
int Find_X(int *arr, int len, int x)
{
for (int i = 0; i < len; i++){
if (arr[i] == x)
return (i);
}
return (-1);
//没找到返回-1;
}
折半查找
//函数功能:用二分法在具有n个元素的数组a中查找x,返回第一次出现的下标。
int BinSearch(int *arr, int len, int x)
{
int left = 0, right = len-1, mid, find_i = -1;//标志变量
while(left <= right && find_i == -1)
{
mid = (left + right) / 2;
if (arr[mid] == x)
find_i = mid;
else if (arr[mid] < x)
left = mid+1;
else if (arr[mid] > x)
right = mid-1;
}
return find_i;
}
局限性:二分查找只适用于有序数组。
排序算法
冒泡排序
//函数功能:用冒泡法对有n个数组元素的数组a进行排序
void BubbleSort(int *arr, int len)
{
int i, j, temp;
for (i = 1; i < len; i++)
for (j = 0; j < len-i; j++)
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
选择排序
void SelectSort(int *arr, int len)
{
int i, j, min_i, temp;
for (i = 0; i < n-1; i++)
{
min_i = i;
for (j = i+1; j < n; j++)
if (arr[j] < arr[i])
min_i = j;
if (min_i != i)
{
temp = arr[i];
arr[i] = arr[min_i];
arr[min_i] = arr[i];
}
}
}
插入排序
void InsertSort(int *arr, int len)
{
int i, j, temp;
for(i = 1; i < len; i++)
{
temp = arr[i];
for (j = i; arr[j-1] > arr[j] && j > 0; j--)
arr[j] = arr[j-1];
arr[j] = temp;
}
}
删除
int DeleteNum(int *arr, int len, int num)
{
int i, j;
for (i = 0; i < len; i++)
{
if (arr[i] == num)
{
for (j = i; j < len-1; j++)
{
arr[j] = arr[j+1];
}
i--;
n--;
}
}
return len;
}
插入
插入到特定位置
int InsertToPos(int *arr, int len, int num, int pos)
{
int i;
if (pos >= n)
printf("wrong position");
else
{
// 从最后一个元素开始到arr[pos],所有元素向后移;
for (i = len-1; i >= pos; i--)
arr[i+1] = arr[i];
arr[pos] = num;
}
return len+1;
}
按顺序插入
int InsertToSortedArray(int *arr, int len, int num)
{
int i;
for (i = 0; num > arr[i] && i < n; i++);
// 找到插入位置i
len = InsertToPos(arr, len, num, i);
return len;
}
删除排序数组的重复项
int removeDuplicates(int* nums, int numsSize)
{
if(numsSize == 0)
return 0;
int fast = 1, slow = 1;
while(fast < numsSize)
{
if(nums[fast] != nums[fast-1])
nums[slow++] = nums[fast];
fast++;
}
return slow;
}