【C语言入门必看】数组排序、二分查找与字符数组全解析
前言数组是C语言中最基础、最常用的数据结构之一。掌握数组的排序、查找以及字符数组的操作是每位C语言学习者的必经之路。本文将带你深入理解选择排序、冒泡排序、二分查找的原理与实现并详细讲解字符数组的定义、初始化、输入输出及常用操作方法。文章结构清晰代码示例丰富助你快速掌握核心知识点。1. 数组排序排序算法是数据处理的基础。下面介绍两种经典的排序算法选择排序和冒泡排序。1选择排序核心思想每一轮从未排序部分中选出最小或最大的元素放到已排序部分的末尾。时间复杂度O(n²)空间复杂度O(1)稳定性选择排序是一种不稳定的排序算法。因为在交换过程中相等元素的相对位置可能会发生变化。#include stdio.h int main(void) { int arr[10] {2, 5, 4, -8, 0, 9, 4, 50, 32, -54}; int len sizeof(arr) / sizeof(arr[0]); int tmp 0; for (int i 0; i len - 1; i) { for (int j i 1; j len; j) { if (arr[i] arr[j]) // 排升序 排降序 { tmp arr[i]; arr[i] arr[j]; arr[j] tmp; } } } for (int i 0; i len; i) { printf(arr[%d] %d\n, i, arr[i]); } return 0; }2冒泡排序核心思想重复地遍历待排序序列依次比较相邻的两个元素如果顺序错误就交换它们直到没有需要交换的元素为止。时间复杂度O(n²)空间复杂度O(1)稳定性冒泡排序是一种稳定的排序算法。因为只有相邻元素比较并交换相等元素的相对位置不会改变。#include stdio.h int main(void) { int arr[10] {1, -5, 40, 39, 0, -25, 69, 44, 3, 21}; int len sizeof(arr) / sizeof(arr[0]); int tmp 0; for (int j 0; j len - 1; j) { for (int i 0; i len - 1 - j; i) { if (arr[i] arr[i 1]) // 排升序 排降序 { tmp arr[i]; arr[i] arr[i 1]; arr[i 1] tmp; } } } for (int i 0; i len; i) { printf(arr[%d] %d\n, i, arr[i]); } return 0; }2. 二分查找折半查找前提条件待查找的序列必须是有序的。核心思想升序为例将待查找的值与序列中间位置的元素进行比较。如果比中间值大则在右半部分继续查找如果比中间值小则在左半部分继续查找如果相等则查找成功。优势查找效率高时间复杂度为 O(log n)。#include stdio.h int main(void) { int arr[10] {50, -1, 2, 3, -4, 5, 6, -7, 64, 9}; int len sizeof(arr) / sizeof(arr[0]); int num 0; // 先对数组进行排序这里使用选择排序 for (int i 0; i len - 2; i) { for (int j i 1; j len - 1; j) { if (arr[i] arr[j]) { int tmp arr[i]; arr[i] arr[j]; arr[j] tmp; } } } for (int i 0; i len; i) { printf(arr[%d] %d\n, i, arr[i]); } printf(Please input a number:\nnum ); scanf(%d, num); // 二分查找 int i 0; int j len - 1; int mid 0; while (i j) { mid (i j) / 2; if (num arr[mid]) { i mid 1; } else if (num arr[mid]) { j mid - 1; } else { printf(Found the number!\narr[%d] %d\n, mid, num); break; } } if (i j) { printf(Not Found!\n); } return 0; }3. 字符型数组字符型数组用于存储字符串即多个字符。1字符数组定义char 数组名[常量]; // 数组名遵循标识符的命名规则。 char str[32]; // 分配32个字节的空间2字符型数组的访问数组名[下标]; // 例如 str[0]; // 访问第一个字符 // 注意下标不能越界否则会导致未定义行为。3字符型数组的初始化全部初始化char str[5] {h, e, l, l, o}; char str[] {h, e, l, l, o}; char str[] {hello}; char str[] hello; // 当[]中的常量被省略时数组空间大小由初始化字符个数决定并自动在末尾添加\0。局部初始化char str[32] {h, e, l, l, o}; char str[32] {hello}; char str[32] hello; // 未初始化的部分默认存储0即\0字符。初始化为全0char str[32] {0}; char str[32] \0;4数组的存储形式单一性数组中的所有元素数据类型必须一致。有序性数组元素按照下标顺序a[0] 到 a[n]连续存储。连续性数组在内存中占用一段连续的空间。5字符型数组的输入输出输入char str[32] {0}; scanf(%s, str); // 遇到空格、Tab、回车会停止读入 gets(str); // 读取一行包括空格但不推荐使用存在缓冲区溢出风险输出char str[32] hello world!; printf(%s\n, str); // 遇到空格、Tab、回车会停止打印 puts(str); // 输出字符串并自动换行6字符型数组的操作方法strlen(str)计算字符串长度有效字符个数不包含结尾的\0。sizeof(str)求字符数组在内存中所占的字节数取决于数组声明时的大小。strcpy(dest, src)将源字符串拷贝到目标字符串。strcat(dest, src)将源字符串拼接到目标字符串的末尾。

相关新闻