int getMax(int ages[], int length)
{
// 注意:不要假设数组以外的值位最大值,会出现意想不到的问题
// int max = 0;
// 假设数组中的第0个元素是最大
int max = ages[0];
for (int i = 0; i < length; i++) {
// 判断从数组中取出的值是否大于max
if (max < ages[i]) {
// 如果大于max就把当前索引对应的元素设置成最大值
max = ages[i];
}
}
return max;
}
int getMax(int ages[], int length)
{
// 把数组中的第0个索引作为最大值
int max = 0;// 是一个索引
for (int i = 1; i < length; i++) {
if (ages[max] < ages[i]) {
max = i;
}
}
return ages[max];
}
例如: 输入:1,3,5
输出:0,2,4,6,7,8,9
// 1.定义变量保存用户输入的值
int num1;
int num2;
int num3;
// 2.接收用户输入的值
printf("请输入3个整数,用逗号隔开\n");
scanf("%d,%d,%d", &num1, &num2, &num3);
for (int i = 0; i < 10 ; i++) {
if ((num1 != i) &&
(num2 != i) &&
(num3 != i)) {
printf("%d\n", i);
}
}
// 1.定义数组,数组可以保存10个数字,正好可以保存0~9
int numbers[10] = {0};
// 2.接收用户的输入,讲用户输入的值保存到数组中
// 1 ,3 ,5将用户输入值,作为数组的索引取数组中修改对应索引的值
int index = -1;// 定义变量用于接收用户输入的值
for (int i = 0; i < 3; i++) {
printf("请输入%d个整数\n", i + 1);
scanf("%d", &index);
// 把用户输入的值,作为数组的索引取修改数组中的值为1
numbers[index] = 1;
}
int length = sizeof(numbers) / sizeof(numbers[0]);
// 遍历数组,查看哪些元素没有被修改过,没有被修改过就是没有出现过
for (int i = 0; i < length; i++) {
if (1 != numbers[i]) {
printf("%d\n", i);
}
}
// 空间换时间, 适合数据比较少
// 1.定义数组,保存用户输入的整数
// 一定要给数组初始化, 否则有可能是一些随机值
int numbers[10] = {0};
// 2.接收用户输入的整数
// 2.1定义变量接收用户输入的整数
int index = -1;
for (int i = 0; i < 6; i++) {
printf("请输入第%d个整数\n", i + 1);
scanf("%d", &index);
// 将用户输入的值作为索引取修改数组中对应的元素的值为1
// 指针的时候回来演示刚才的问题
numbers[index] = 1 ;
}
int length = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i < length; i++) {
if (1 == numbers[i]) {
// 输出索引
printf("%d", i);
}
}
// 1.定义数组,保存用户输入的整数
int numbers[10] = {0};
// 2.接收用户输入的整数
// 2.1定义变量接收用户输入的整数
int index = -1;
for (int i = 0; i < 6; i++) {
printf("请输入第%d个整数\n", i + 1);
scanf("%d", &index);
// 将用户输入的值作为索引取修改数组中对应的元素的值为1
// 假设 用户输入的是 1,1,1,2,2,2
numbers[index] = numbers[index] + 1 ;
}
int length = sizeof(numbers) / sizeof(numbers[0]);
for (int i = 0; i < length; i++) {
// j = 1 因为如果数组元素中存储的值是0不用输出
// 将i对应存储空间中的元素取出,判断需要输出几次
for (int j = 1; j <= numbers[i]; j++) {
printf("%d", i);// 1 1 1 2 2 2
}
}
#include <stdio.h>
int main(int argc, const char * argv[]) {
/*
思路:
1.先分析如何比较
2.找出比较的规律比较完一次之后第二次比较会少一次
3.打印倒三角
4.打印需要比较的角标
5.比较并交换位置
6.将常量替换为变量(length)
*/
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[6] = {99, 12, 88, 34, 67, 7};
int length = sizeof(nums) / sizeof(nums[0]);
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
// printf("*");
// printf("%i == %i\n", j, j+1);
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
// printf("\n");
}
printf("----------\n");
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
return 0;
}
#include <stdio.h>
void selectSort(int nums[], int length);
void printArray(int nums[], int length);
//void swap(int v1, int v2);
void swap(int nums[], int i, int j);
void bubbleSort(int nums[], int length);
int main(int argc, const char * argv[])
{
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};
int length = sizeof(nums) / sizeof(nums[0]);
printArray(nums, length);
// selectSort(nums, length);
bubbleSort(nums, length);
printf("----------------\n");
printArray(nums, length);
return 0;
}
// 遍历数组
void printArray(int nums[], int length)
{
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
}
void bubbleSort(int nums[], int length)
{
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j+1);
}
}
}
}
// 选择排序
void selectSort(int nums[], int length)
{
for (int i = 0; i < length - 1; i++) {
for (int j = i+1; j < length; j++) {
if (nums[i] > nums[j]) {
/*
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
*/
// swap(nums[i], nums[j]);
swap(nums, i, j);
}
}
}
}
// 基本数据类型作为函数的参数, 是值传递, 在函数中修改形参不会影响实参的值
/*
void swap(int v1, int v2)
{
int temp = v1;
v1 = v2;
v2 = temp;
}
*/
// 交换两个数的值
void swap(int nums[], int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
int main(int argc, const char * argv[]) {
// 已知一个无序的数组, 里面有5个元素, 要求对数组进行排序
int nums[8] = {99, 12, 88, 34, 5, 44, 12, 100};
int length = sizeof(nums) / sizeof(nums[0]);
printf("length = %i\n", length);
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
// length - 1是为了防止角标越界
// length - 1因为最后一个元素已经没有可以比较的了
// 0, 1, 2, 3, 4
for (int i = 0; i < length - 1; i++) {
for (int j = i+1; j < length; j++) {
// printf("*");
// printf("i = %i, j = %i\n", i, j);
if (nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
// printf("\n");
}
printf("--------------\n");
for (int i = 0; i < length; i++) {
printf("nums[%i] = %i\n", i, nums[i]);
}
return 0;
}
#include <stdio.h>
#include <time.h>
int findKey(int nums[], int key, int length);
int findKey2(int nums[], int length, int key);
int findKey3(int nums[], int length, int key);
int main(int argc, const char * argv[]) {
// 现在已知一个有序的数组, 和一个key. 要求从数组中找到key对应的索引的位置
// 对该方法进行封装, 要求找到就返回对应的索引, 找不到就返回-1
int nums[500000] = {1, 3, 5, 7, 9, [499999] = 99};
int key = 99;
int length = sizeof(nums) / sizeof(nums[0]);
/*
// 消耗了多少1181毫秒
clock_t startTime = clock();
int index = findKey(nums, key, length);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index);
*/
// 消耗了多少1毫秒
clock_t startTime = clock();
// int index = findKey2(nums, length, key);
// 消耗了多少2毫秒
int index = findKey3(nums, length, key);
clock_t endTime = clock();
printf("消耗了多少%lu毫秒\n", endTime - startTime);
printf("index = %i\n", index);
return 0;
}
int findKey3(int nums[], int length, int key)
{
int min, max, mid;
min = 0;
max = length - 1;
// 只要还在我们的范围内就需要查找
while (min <= max) {
// 计算中间值
mid = (min + max) / 2;
if (key > nums[mid]) {
min = mid + 1;
}else if (key < nums[mid])
{
max = mid - 1;
}else
{
return mid;
}
}
return -1;
}
int findKey2(int nums[], int length, int key)
{
int min, max, mid;
min = 0;
max = length - 1;
mid = (min + max) / 2;
while (key != nums[mid]) {
// 判断如果要找的值, 大于了取出的值, 那么min要改变
if (key > nums[mid]) {
min = mid + 1;
// 判断如果要找的值, 小雨了取出的值, 那么max要改变
}else if (key < nums[mid])
{
max = mid - 1;
}
// 超出范围, 数组中没有需要查找的值
if (min > max) {
return -1;
}
// 每次改变完min和max都需要重新计算mid
mid = (min + max) / 2;
}
// printf("aaaaaa\n");
return mid;
}
int findKey(int nums[], int key, int length)
{
for (int i = 0; i < length; i++) {
if (nums[i] == key) {
// printf("%i\n", i);
return i;
}
}
return -1;
}
#include <stdio.h>
int insertValue(int nums[], int length, int key);
int main(int argc, const char * argv[]) {
// 现有一个有序的数组, 要求给定一个数字, 将该数字插入到数组中, 还要保证数组是有序的
// 其实就是找到需要插入数字的位置
// 其实这个位置就是min的位置
/*
min = 0
max = 4
mid = 2
*/
// 0 1 2 3 4 5
int nums[5] = {1, 3, 5, 7,9};
int key = 4;
int length = sizeof(nums) / sizeof(nums[0]);
printf("需要插入的位置是%i\n", insertValue(nums, length, key));
return 0;
}
int insertValue(int nums[], int length, int key)
{
int min , max, mid;
min = 0;// 1 2
max = length - 1;// 4 1
while (min <= max) {
mid = (min + max) / 2; // 2 0 1
if (key > nums[mid]) {
min = mid + 1;
}else if (key < nums[mid])
{
max = mid - 1;
}
}
return min;
}