C语言基础总结 ( 二 )----------数组总结( 重点排序算法 )
😊写一个程序,初始化一个数组。要求数组长度为10,里面的值为0-9的随机数,并且每一个数字出现一次。
思路:
1,创建数组
2,创建随机数
3,存到数组中 nums[i++] = ...
4,使用循环创建数据,并加入到数组中.循环几次? while(i < 10)
5,创建数字,判断数组中是否有该数字,如果没有就加入,如果有就重新创建
6,如何判断一个数字在数组中或不在数组中呢?
int nums[] = {1,2,3};
3在不在,4在不在?
遍历一下,看直到遍历结束,如果都没有这个数字,就表示不存在
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]);
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;
}
}
}
}
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;
}
}
}
}
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;
}
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;
// 假定找到目标数据,就返回它的下标,如果没找到,就返回-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;
}
我的能力超乎我的想象
我的奋斗决定我的未来