0

0

C语言中怎样实现数组排序 C语言数组排序算法与示例代码解析

下次还敢

下次还敢

发布时间:2025-07-23 12:46:02

|

979人浏览过

|

来源于php中文网

原创

c语言中实现数组排序需根据需求选择合适算法。1. 冒泡排序通过重复遍历比较交换相邻元素;2. 选择排序每次找最小元素放到起始位置;3. 插入排序通过构建有序序列逐个插入元素;4. 快速排序使用分治法递归排序;5. 归并排序也用分治法递归拆分再合并子数组。优化方法包括选用高效算法、减少操作次数、并行处理及利用硬件加速。此外,可使用标准库qsort函数实现通用排序。

C语言中怎样实现数组排序 C语言数组排序算法与示例代码解析

C语言中实现数组排序,简单来说就是将数组中的元素按照一定的规则(例如从小到大或从大到小)重新排列。有很多算法可以完成这项任务,选择哪种算法取决于你的具体需求,比如数组的大小、元素的特性以及对性能的要求。

C语言中怎样实现数组排序 C语言数组排序算法与示例代码解析

C语言数组排序算法与示例代码解析

C语言中怎样实现数组排序 C语言数组排序算法与示例代码解析

数组排序的方法有很多,每种方法都有其优缺点,适用于不同的场景。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等等。

立即学习C语言免费学习笔记(深入)”;

如何选择合适的排序算法?

选择排序算法要考虑几个关键因素:

C语言中怎样实现数组排序 C语言数组排序算法与示例代码解析
  • 时间复杂度: 这是衡量算法效率的重要指标。例如,快速排序和归并排序的平均时间复杂度为O(n log n),而冒泡排序、选择排序和插入排序的时间复杂度为O(n^2)。对于大型数组,选择O(n log n)的算法通常更高效。
  • 空间复杂度: 算法执行过程中所需的额外空间。例如,归并排序需要额外的O(n)空间,而冒泡排序、选择排序和插入排序只需要O(1)的额外空间。
  • 稳定性: 稳定性是指排序后相等元素的相对顺序是否保持不变。例如,如果两个元素的值相等,并且在排序前A在B的前面,那么在排序后A仍然在B的前面,则该排序算法是稳定的。有些应用场景需要保持元素的原始顺序,这时就需要选择稳定的排序算法。插入排序和归并排序是稳定的,而快速排序和选择排序是不稳定的。
  • 数组大小和数据特性: 对于小型数组,简单的排序算法(如插入排序)可能比复杂的算法更快,因为它们的常数因子较小。如果数组已经部分排序,插入排序的性能会更好。如果数组包含大量重复元素,某些排序算法(如三向切分的快速排序)可能更有效。

下面是一些常见排序算法的C语言实现示例:

1. 冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,比较相邻的元素,如果它们的顺序错误就交换它们。

#include 

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j + 1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

2. 选择排序

选择排序的工作原理是每次从待排序的数组中找到最小(或最大)的元素,然后将其放到数组的起始位置。

多墨智能
多墨智能

多墨智能 - AI 驱动的创意工作流写作工具

下载
#include 

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int min_idx = i;
        for (int j = i + 1; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;

        // 交换 arr[i] 和 arr[min_idx]
        int temp = arr[i];
        arr[i] = arr[min_idx];
        arr[min_idx] = temp;
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    selectionSort(arr, n);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

3. 插入排序

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

#include 

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;

        // 将 arr[0..i-1] 中大于 key 的元素向后移动一位
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    insertionSort(arr, n);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

4. 快速排序

快速排序是一种高效的排序算法,它使用分治法将数组分成较小的子数组,然后递归地对子数组进行排序。

#include 

void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // 选择最后一个元素作为枢轴
    int i = (low - 1); // 较小元素的索引

    for (int j = low; j <= high - 1; j++) {
        // 如果当前元素小于或等于枢轴
        if (arr[j] <= pivot) {
            i++; // 增加较小元素的索引
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // pi 是分区索引, arr[pi] 现在位于正确的位置
        int pi = partition(arr, low, high);

        // 分别对分区前后的元素进行递归排序
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    quickSort(arr, 0, n - 1);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

5. 归并排序

归并排序也是一种高效的排序算法,它也使用分治法。它将数组分成两个子数组,递归地对子数组进行排序,然后将排序后的子数组合并成一个有序数组。

#include 
#include 

// 合并两个已排序的子数组 arr[l..m] 和 arr[m+1..r]
void merge(int arr[], int l, int m, int r) {
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;

    // 创建临时数组
    int L[n1], R[n2];

    // 将数据复制到临时数组 L[] 和 R[]
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    // 合并临时数组到 arr[l..r]
    i = 0; // L[] 的初始索引
    j = 0; // R[] 的初始索引
    k = l; // 合并子数组的初始索引
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // 复制 L[] 中剩余的元素
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    // 复制 R[] 中剩余的元素
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

// 归并排序的递归函数
void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        // 找到中间点
        int m = l + (r - l) / 2;

        // 递归排序前半部分和后半部分
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);

        // 合并已排序的两部分
        merge(arr, l, m, r);
    }
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    mergeSort(arr, 0, n - 1);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

如何优化C语言中的排序算法?

优化排序算法是一个复杂的话题,它取决于具体的应用场景和需求。一些常见的优化技巧包括:

  • 使用更高效的算法: 如前所述,选择合适的排序算法是优化的关键。对于大型数组,快速排序和归并排序通常比冒泡排序、选择排序和插入排序更高效。
  • 减少比较和交换的次数: 比较和交换是排序算法中最耗时的操作。可以通过优化算法的逻辑来减少这些操作的次数。例如,在插入排序中,可以使用二分查找来找到插入位置,从而减少比较的次数。
  • 使用并行排序: 对于多核处理器,可以使用并行排序算法来提高排序速度。例如,可以将数组分成多个子数组,然后并行地对子数组进行排序,最后将排序后的子数组合并成一个有序数组。
  • 利用硬件加速: 某些硬件平台提供了专门的排序指令或加速器。可以利用这些硬件加速来提高排序速度。

除了自己实现排序算法,C语言还有其他排序方法吗?

是的,C语言标准库 stdlib.h 提供了 qsort 函数,它是一个通用的排序函数,可以对任何类型的数组进行排序。

#include 
#include 

int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, n, sizeof(int), compare);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
    return 0;
}

qsort 函数需要一个比较函数作为参数,该函数用于比较数组中的两个元素。比较函数应该返回:

  • 负值,如果第一个元素小于第二个元素。
  • 零,如果两个元素相等。
  • 正值,如果第一个元素大于第二个元素。

使用 qsort 函数的优点是它是一个通用的排序函数,可以对任何类型的数组进行排序。缺点是它的性能可能不如专门为特定类型的数组设计的排序算法。此外,qsort 的比较函数需要使用指针,这可能会增加代码的复杂性。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

399

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

618

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

354

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

259

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

600

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

526

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

642

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

601

2023.09.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.7万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

Go 教程
Go 教程

共32课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号