C 语言基础五: 数组 - 练习demo
一.基础习题
习题1 - 求最值
已知数组元素 22 45 32 56 78,求最大值输出
ini
int arr[] = {22,45, 32, 78,56,66 };
int len = sizeof(arr)/sizeof(int);
int max = arr[0];
for (int i = 1; i < len; i++) {
if(arr[i] > max){
max = arr[i];
}
}
printf("%d\n",max);
习题2 - 求和
- 生成10个1-100随机数求和,且随机数不重复
- 统计有几个值比平均值小
ini
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int contain(int arr[],int len,int num);
int main(void){
int arr[10];
int len = sizeof(arr)/sizeof(int);
//设置随机数种子
srand(time(NULL));
int sum = 0;
for (int i = 0; i < len; ) {
int num = rand() % 100 ;
if(!contain(arr,len,num)){
arr[i] = num;
printf("pr: %d\n",arr[i]);
sum = sum + arr[i];
i++;
}
}
printf("总和: %d\n",sum);
int eve = sum/len;
printf("平均值: %d\n",eve);
int count = 0;
for (int j = 0; j < len; j++) {
if(arr[j] < eve){
count ++;
}
}
printf("小于平均值个数: %d\n",count);
}
int contain(int arr[],int len,int num){
for (int i = 0; i < len; i++) {
int x = arr[i];
if (x == num) {
return 1;
}
}
return 0;
}
习题3 - 反转数组
ini
#include <stdio.h>
// 反转数组
void printfArr(int arr[],int len);
int main(void){
int arr[] = {22,33,44,55,66};
int len = sizeof(arr)/sizeof(int);
int i = 0;
int j = len -1;
while (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
printfArr(arr, len);
}
void printfArr(int arr[],int len){
for (int i = 0; i < len; i++) {
printf("%d \n",arr[i]);
}
}
习题4 - 打乱数组
ini
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int arr[] = {22,33,44,55,66};
int len = sizeof(arr)/sizeof(int);
//设置随机数种子
srand(time(NULL));
for (int i = 0; i < len; i ++) {
int index = rand()%len;
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
for (int j = 0; j < len; j++) {
printf("%d \n",arr[j]);
}
}
二.查找
基础查找
ini
#include <stdio.h>
int findElement(int arr[],int len,int num);
int main(void){
int arr[] = {22,33,44,55,66};
int len = sizeof(arr)/sizeof(int);
int index1 = findElement(arr,len,44);
int index2 = findElement(arr,len,88);
printf("index1:%d\n",index1);
printf("index2:%d\n",index2);
}
int findElement(int arr[],int len,int num){
for (int i = 0; i < len; i++) {
if(arr[i] == num){
return i;
}
}
return -1;
}
二分查找
- 使用二分查找要排列好顺序,下面例子是升序
c
#include <stdio.h>
int searchIndex(int arr[],int len,int num);
int main(void){
//二分查找
int arr[] = {12,13,14,15,16,17,18};
int len = sizeof(arr)/sizeof(int);
printf("12:%d\n",searchIndex(arr, len, 12));
printf("13:%d\n",searchIndex(arr, len, 13));
printf("14:%d\n",searchIndex(arr, len, 14));
printf("15:%d\n",searchIndex(arr, len, 15));
printf("16:%d\n",searchIndex(arr, len, 16));
printf("17:%d\n",searchIndex(arr, len, 17));
printf("18:%d\n",searchIndex(arr, len, 18));
printf("20:%d\n",searchIndex(arr, len, 20));
return 0;
}
int searchIndex(int arr[],int len,int num){
int left = 0;
int right = len - 1;
while (left <= right) {
// 45
int mid = left + (right - left)/2;
if(arr[mid] == num){
return mid;
}else if (arr[mid] > num){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
插值查找
- 使用二分查找要排列号顺序,且均匀分布. 数据量大的数组合适,数据量小适合用二分查找 (1,3,4,5,6这种是均匀分布的,1,2,101,200 这种不是均匀的)
scss
#include <stdio.h>
int findElement(int arr[],int len,int num);
int main(void){
int arr[] = {12,14,15,16,18,19,22,23};
int len = sizeof(arr)/sizeof(int);
printf("12:%d\n",insert_select(arr, len, 12));
printf("14:%d\n",insert_select(arr, len, 14));
printf("15:%d\n",insert_select(arr, len, 15));
printf("16:%d\n",insert_select(arr, len, 16));
printf("18:%d\n",insert_select(arr, len, 18));
printf("19:%d\n",insert_select(arr, len, 19));
printf("22:%d\n",insert_select(arr, len, 22));
printf("23:%d\n",insert_select(arr, len, 23));
printf("24:%d\n",insert_select(arr, len, 24));
}
int insert_select(int arr[], int len,int num){
int left = 0;
int right = len - 1;
while (left <= right) {
int ap = (num - arr[left])/(arr[right] - arr[left]);
int half = left + (right - left) * ap;
if(arr[half] == num){
return half;
}else if(arr[half] > num){
right = half -1;
}else{
left = half + 1;
}
}
return -1;
}
三.排序
冒泡排序
- 数量小且基本有序的情况
ini
#include <stdio.h>
void bubble(int arr[],int len);
void print_array(int arr[], int n);
int main(void){
int arr[] = {4,2,7,6,10,5,1};
int len = sizeof(arr)/sizeof(int);
print_array(arr, len);
bubble(arr, len);
return 0;
}
// 打印数组函数
void print_array(int arr[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void bubble(int arr[],int len){
int temp;
for (int j = 0; j < len-1; j++) {
for (int i = 0; i < len-1-j; i++) { //没走一次都会把最大的数移动到最右边
if(arr[i] > arr[i+1]){
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
print_array(arr, len);
}
}
选择排序
- 数据量小,且交换操作代价高的情况
ini
//交换元素
void swap(int* a,int* b){
int temp = *a;
*a = *b;
*b = temp;
}
void select_sort(int arr[],int len){
int i ,j, min_index;
for (i = 0; i < len-1; i++) {
min_index = i;
for (j = i+1; j < len; j++) { //找到最小元素,和当前做交换
if(arr[j] < arr[min_index]){
min_index = j;
}
}
if(min_index != i){
swap(&arr[i], &arr[min_index]);
}
print_array(arr, len);
}
}
插入排序
- 适用小规模或部分有序的数据
ini
//插入排序
void insert_sort(void){
int arr[] = {5,4,2,6,1,3 };
int len = sizeof(arr)/sizeof(int);
int i ,j ,key;
for (i = 1 ; i < len; i++) {
key = arr[i];
j = i -1;
while (j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j--;
}
arr[j + 1] = key;
print_array(arr, len);
}
}