C语言直接插入排序与直接选择排序原理解析与实现

晚来风
晚来风
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析C语言中常用的两种基础排序算法:直接插入排序与直接选择排序。通过拆解基本思路、提供完整可运行的C语言代码示例,帮助开发者理解这两种时间复杂度均为 O(n²) 的算法原理及其具体实现细节。

直接插入排序

直接插入排序(Straight Insertion Sort)是一种简单直观的排序方法。其核心思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

基本原理

  1. 初始化有序区:假设数组的第一个元素 a[0] 是有序的,其余元素 a[1] ~ a[n-1] 是无序的。
  2. 逐个插入:从第二个元素 a[1] 开始,将其插入到前面已排好的有序子序列中。比较过程中,如果当前元素小于前一个元素,则交换位置或后移,直到找到合适的插入点。
  3. 循环结束:重复上述过程,直到处理完最后一个元素 a[n-1],整个数组即变为有序。

C语言代码实现

以下代码展示了直接插入排序的具体实现。包含核心的 insertsort 函数用于执行排序,以及辅助的 swap 函数用于元素交换。

#include <stdio.h>
#define N 5 

void insertsort(int a[], int n); 
void swap(int *x, int *y); 

// 直接插入排序主函数
void insertsort(int a[], int n){ 
  int i, j;
  // 从第二个元素开始遍历
  for(i=1; i<n; i++){ 
    // 当当前元素小于前一个元素时,向前扫描并交换
    for(j=i; j>0 && a[j]<a[j-1]; j--){ 
      swap(&a[j], &a[j-1]); 
    }   
  }
}

// 交换两个整数的值
void swap(int *x, int *y){ 
  int temp = *x; 
  *x = *y; 
  *y = temp;
} 

int main(void){ 
  int a[N] = {2, 5, 3, 1, 8}; 
  insertsort(a, N); 
  
  // 输出排序后的结果
  int i;
  for(i=0; i<N; i++) 
    printf("%d ", a[i]); 
  return 0; 
}

关键点说明:

  • swap 函数使用指针传递,确保修改的是原始数组中的值。
  • 内部循环 j-- 实现了从当前位置向前查找插入位置的过程。

直接选择排序

直接选择排序(Straight Selection Sort)也是一种简单的排序算法。它的基本策略是每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子序列的最后,直到全部记录排序完毕。

基本原理

  1. 寻找最小值:从第1个位置(索引 0)开始,在剩余的无序部分中找到最小元素的下标。
  2. 交换位置:将找到的最小元素与当前位置的元素交换。
  3. 缩小范围:接下来从第2个位置(索引 1)开始,重复上述步骤,直到倒数第二个元素处理完毕。

C语言代码实现

以下是直接选择排序的C语言实现。核心在于 selectsort 函数中通过嵌套循环查找最小值索引并进行交换。

#include <stdio.h>
#define N 5 

void selectsort(int a[], int n); 
void swap(int *x, int *y); 

// 直接选择排序主函数
void selectsort(int a[], int n){ 
  int i, j;
  // 遍历到倒数第二个元素即可
  for(i=0; i<n - 1; i++){ 
    int min = i; // 假设当前i是最小值的索引
    // 在未排序部分查找真正的最小值
    for(j=i+1; j<n; j++){ 
      if(a[j] < a[min]){ 
        min = j; 
      }
    }
    // 如果找到的最小值不在当前i位置,则交换
    if(min != i) {
        swap(&a[i], &a[min]); 
    }
  }
}

// 交换两个整数的值
void swap(int *x, int *y){ 
  int temp = *x; 
  *x = *y; 
  *y = temp;
} 

int main(void){ 
  int a[N] = {2, 5, 3, 1, 8}; 
  selectsort(a, N); 
  
  // 输出排序后的结果
  int i;
  for(i=0; i<N; i++) 
    printf("%d ", a[i]); 
  return 0; 
}

优化提示:

  • 在 selectsortif(min != i) 判断,避免自身与自身交换的不必要操作,提升轻微性能。
  • 外层循环条件应为 i < n - 1,因为当剩下最后一个元素时,它必然已经是最大的(相对于前面的有序部分),无需再参与选择和交换。

总结对比

两种算法的时间复杂度在最坏、最好和平均情况下均为 O(n²),适用于小规模数据或作为复杂算法的基础教学示例。直接插入排序在数据基本有序时表现较好(接近 O(n)),而直接选择排序进行的数据移动次数较少(最多 n-1 次交换),但比较次数固定。

以上就是C语言直接插入排序与直接选择排序的详细实现内容,更多关于算法基础学习资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。