? 写一个程序,初始化一个数组。要求数组长度为10,里面的值为0-9的随机数,并且每一个数字出现一次。
思路:
1,创建数组
2,创建随机数 3,存到数组中 nums[i++] = ... 4,使用循环创建数据,并加入到数组中.循环几次? while(i < 10) 5,创建数字,判断数组中是否有该数字,如果没有就加入,如果有就重新创建 6,如何判断一个数字在数组中或不在数组中呢? int nums[] = {1,2,3}; 3在不在,4在不在? 遍历一下,看直到遍历结束,如果都没有这个数字,就表示不存在
数组初始化?
用代码来实现:
int nums[LEN], i = 0, temp, index; while (i < 10) { temp = arc4random_uniform(10); // 循环用随机数和数组元素比较,看是否相等 for (index = 0; index < i; index++) { if (temp == nums[index]) { break; } } // index == i说明for循环结束,随机数和数组元素不相等 if (index == i) { nums[i++] = temp; } } // 循环结束,把随机数打印出来 for (int j = 0; j < 10; j++) { printf("%d\t%d\n", j + 1, nums[j]);
}
? 冒泡排序(大的放右边)
void bubbleSort(int nums[], int lengh){ for (int i = 0; i < lengh - 1; i++) { for (int j = 0; j < lengh - 1 - i; j++) { if (nums[j] > nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } }
? 选择排序(小的放左边)
void chooseSort(int nums[], int length){ for (int i = 0; i < length - 1; i++) { for (int j = i; j < length; j++) { if (nums[j] < nums[i]) { int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } } } }
☺️ 选择排序优化:
int min = -1; for(int j = 0; j < 4 - 1; j++) { min = j; // 记录了最小取值的下标(索引) for (int i = j + 1; i < 4; i++) { if(nums[min] > nums[i]) { min = i; } } // 将最小的与第j项交换 if(min != j) { temp = nums[min]; nums[min] = nums[j]; nums[j] = temp; }
}
? 二分法查找数据 前提:数组是从小到大排列的
// 二分法就是折中来求,目标数据大于中间数,就在右半边中找,循环执行... // 假定找到目标数据,就返回它的下标,如果没找到,就返回-1 int indexOf(int nums[], int length, int keydata){ // keydata 表示要找的目标数据 // 由于要执行循环的次数未知,所以用while循环来实现 int low = 0, high = length - 1,mid; while (low <= high) { mid = (low + high) / 2; if (keydata == nums[mid]) { return mid; }else if (keydata > nums[mid]){ low = mid + 1; }else high = mid - 1; } return -1;
}