【C语言】常见的几种排序方式

简介: 【C语言】常见的几种排序方式

C语言中常见的排序方式有:冒泡排序、选择排序、插入排序、快速排序、归并排序等。

1.冒泡排序

冒泡排序的核心思想是依次比较相邻的两个元素,如果它们的顺序不对就交换它们,直到没有元素需要交换为止。冒泡排序每次会把当前未排序部分的最大值交换到最后。

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {   // 外层循环控制轮数
        for (int j = 0; j < n - 1 - i; j++) {   // 内层循环控制比较次数
            if (arr[j] > arr[j + 1]) {   // 如果前一个元素比后一个元素大,则交换它们的位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

2.选择排序

选择排序的核心思想是依次选择当前未排序部分的最小元素,放到已排序部分的末尾。在未排序部分中找到最小元素的操作可以通过直接遍历数组和记录最小值的方式实现。

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {   // 外层循环控制轮数
        int minIndex = i;   // 记录最小元素的下标
        for (int j = i + 1; j < n; j++) {   // 内层循环在未排序部分中找到最小元素
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {   // 如果最小元素不在已排序部分的末尾,则交换它们的位置
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

3.插入排序

插入排序的核心思想是把当前未排序部分的元素插入到已排序部分的合适位置。对于每个待插入的元素,从已排序部分的末尾往前找到第一个比它小的元素,然后把它插入到该元素后面。

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {   // 外层循环从第二个元素开始,依次将它插入到已排序部分的合适位置
        int temp = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > temp) {   // 内层循环找到temp应该插入的位置
            arr[j + 1] = arr[j];   // 将大于temp的元素后移一位
            j--;
        }
        arr[j + 1] = temp;
    }
}

4.快速排序

快速排序的核心思想是通过分治的思想将一个大问题分解成小问题来解决。它的具体实现是选定一个基准值,然后将小于等于基准值的元素放到左边,大于基准值的元素放到右边。然后对左右两个部分分别递归地进行快速排序。

void quickSort(int arr[], int left, int right) {
    if (left >= right) return;   // 边界条件
    int i = left, j = right, pivot = arr[left];   // 将最左边的元素选为基准值
    while (i < j) {
        while (i < j && arr[j] >= pivot) j--;   // 从右往左找到第一个小于基准值的元素
        if (i < j) arr[i++] = arr[j];
        while (i < j && arr[i] < pivot) i++;   // 从左往右找到第一个大于等于基准值的元素
        if (i < j) arr[j--] = arr[i];
    }
    arr[i] = pivot;
    quickSort(arr, left, i - 1);   // 递归地对左右两部分进行排序
    quickSort(arr, i + 1, right);
}

5.归并排序

归并排序的核心思想也是分治。将一个数组分为左右两个部分,先递归地对左右两部分分别进行排序,然后将排序好的两部分合并起来。在合并的过程中,记录左右两部分数组的起始位置和当前比较位置,将它们比较大小后放到一个辅助数组中,最后再将辅助数组复制回原数组中。归并排序需要辅助数组的支持。

void merge(int arr[], int left, int mid, int right) {
    int *temp = new int[right - left + 1];   // 定义一个辅助数组
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {   // 循环将左右两部分中的较小元素放到辅助数组中
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) temp[k++] = arr[i++];   // 检查左右两部分是否还有未放入辅助数组中的元素
    while (j <= right) temp[k++] = arr[j++];
    for (i = 0; i < k; i++) {   // 将辅助数组中的元素复制回原数组
        arr[left + i] = temp[i];
    }
    delete[] temp;
}
void mergeSort(int arr[], int left, int right) {
    if (left >= right) return;   // 边界条件
    int mid = (left + right) / 2;   // 将数组分为左右两部分
    mergeSort(arr, left, mid);   // 递归地对左右两部分进行排序
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);   // 将已经排好序的左右两部分合并起来
}


目录
相关文章
|
13天前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
本任务要求从键盘输入三个数,并按从小到大的顺序排序后输出。主要内容包括: - **任务描述**:实现三个数的排序并输出。 - **编程要求**:根据提示在编辑器中补充代码。 - **相关知识**: - 选择结构(if、if-else、switch) - 主要语句类型(条件语句) - 比较操作与交换操作 - **测试说明**:提供两组测试数据及预期输出。 - **通关代码**:完整代码示例。 - **测试结果**:展示测试通过的结果。 通过本任务,你将掌握基本的选择结构和排序算法的应用。祝你成功!
28 4
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
170 7
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
140 8
|
8月前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
59 1
|
3月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
8月前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
3月前
|
NoSQL 算法 Redis
Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集
本博客介绍了如何在C语言中实现一个平衡二叉树,并通过这个数据结构来模拟Redis中的排序集功能。
25 0
|
8月前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
88 1
C语言数据结构算法,常用10种排序实战
|
8月前
|
算法 搜索推荐 数据处理
C语言中的排序与查找技术详解
C语言中的排序与查找技术详解
102 1
|
8月前
|
C语言
【C语言/数据结构】排序(直接插入排序|希尔排序)
【C语言/数据结构】排序(直接插入排序|希尔排序)
61 4

热门文章

最新文章