【C语言入门必看】数组排序、二分查找与字符数组全解析
2026/7/30 6:19:34 网站建设 项目流程

📚 前言

数组是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'字符)。
  • 初始化为全0
char 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):将源字符串拼接到目标字符串的末尾。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询