c语言实现的几种常用排序算法

yizhihongxing

C语言实现的几种常用排序算法

简介

排序是算法中最基本的任务之一,其目的是将一系列元素按照一定的顺序进行排列。在实际开发中,排序算法被广泛应用,如数据分析、数据库查找等场景。在C语言中,有多种常用的排序算法,本文将详细介绍几种排序算法的实现方法。

冒泡排序(Bubble Sort)

冒泡排序是一种基本的排序算法,其原理是通过多次比较和交换来实现排序。其实现过程如下:

void bubble_sort(int array[], int size) {
    int i, j;
    for (i = 0; i < size - 1; i++) {           
        for (j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {     
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
    }
}

示例说明:

#include <stdio.h>

void bubble_sort(int array[], int size) {
    int i, j;
    for (i = 0; i < size - 1; i++) {           
        for (j = 0; j < size - i - 1; j++) {
            if (array[j] > array[j + 1]) {     
                int tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
            }
        }
    }
}

int main() {
    int array[] = { 5, 3, 4, 8, 10, 2, 1 };
    int i, size;
    size = sizeof(array) / sizeof(int);
    bubble_sort(array, size);
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

运行结果为:

1 2 3 4 5 8 10

快速排序(Quick Sort)

快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序序列分割成两个子序列,其中左子序列的所有元素均小于右子序列的所有元素,然后再分别对左子序列和右子序列进行排序。其实现过程如下:

void quick_sort(int array[], int low, int high) {
    if (low < high) {                               
        int i = low, j = high, x = array[low];
        while (i < j) {
            while (i < j && array[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if (i < j)
                array[i++] = array[j];
            while (i < j && array[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if (i < j)
                array[j--] = array[i];
        }       
        array[i] = x;
        quick_sort(array, low, i - 1);            
        quick_sort(array, i + 1, high);           
    }
}

示例说明:

#include <stdio.h>

void quick_sort(int array[], int low, int high) {
    if (low < high) {                               
        int i = low, j = high, x = array[low];
        while (i < j) {
            while (i < j && array[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if (i < j)
                array[i++] = array[j];
            while (i < j && array[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if (i < j)
                array[j--] = array[i];
        }       
        array[i] = x;
        quick_sort(array, low, i - 1);            
        quick_sort(array, i + 1, high);           
    }
}

int main() {
    int array[] = { 5, 3, 4, 8, 10, 2, 1 };
    int i, size;
    size = sizeof(array) / sizeof(int);
    quick_sort(array, 0, size - 1);
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

运行结果为:

1 2 3 4 5 8 10

归并排序(Merge Sort)

归并排序是一种分治思想的排序算法,其基本思想是将一组待排序序列分成两个子序列,对它们分别进行排序,然后将它们合并成一个较大的已排序序列。其实现过程如下:

void merge_sort(int array[], int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        merge_sort(array, start, mid);
        merge_sort(array, mid + 1, end);
        merge(array, start, mid, end);
    }
}

void merge(int array[], int start, int mid, int end) {
    int left_array[100], right_array[100];
    int i, j, k;
    for (i = start; i <= mid; i++)
        left_array[i - start] = array[i];
    left_array[i - start] = INT_MAX;
    for (j = mid + 1; j <= end; j++)
        right_array[j - mid - 1] = array[j];
    right_array[j - mid - 1] = INT_MAX;
    i = j = 0;
    for (k = start; k <= end; k++) {
        if (left_array[i] < right_array[j])
            array[k] = left_array[i++];
        else
            array[k] = right_array[j++];
    }
}

示例说明:

#include <stdio.h>
#include <limits.h>

void merge_sort(int array[], int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        merge_sort(array, start, mid);
        merge_sort(array, mid + 1, end);
        merge(array, start, mid, end);
    }
}

void merge(int array[], int start, int mid, int end) {
    int left_array[100], right_array[100];
    int i, j, k;
    for (i = start; i <= mid; i++)
        left_array[i - start] = array[i];
    left_array[i - start] = INT_MAX;
    for (j = mid + 1; j <= end; j++)
        right_array[j - mid - 1] = array[j];
    right_array[j - mid - 1] = INT_MAX;
    i = j = 0;
    for (k = start; k <= end; k++) {
        if (left_array[i] < right_array[j])
            array[k] = left_array[i++];
        else
            array[k] = right_array[j++];
    }
}

int main() {
    int array[] = { 5, 3, 4, 8, 10, 2, 1 };
    int i, size;
    size = sizeof(array) / sizeof(int);
    merge_sort(array, 0, size - 1);
    for (i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}

运行结果为:

1 2 3 4 5 8 10

结论

以上就是三种常用的排序算法的完整攻略,在实际开发中需要根据具体情况进行选择。冒泡排序是较为简单的一种排序算法,但对于大规模的数据处理效率很低;快速排序是一种高效的排序算法,但在对于处理极端数据情况下效率会相对较低;归并排序则相比其他两种排序算法稍微复杂一些,但具有稳定性和较高的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言实现的几种常用排序算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】

    PHP四种排序算法实现及效率分析 本文将介绍 PHP 中的四种常用排序算法,这四种算法分别是冒泡排序、插入排序、选择排序和快速排序。我们会详细讲解它们的思路、实现方式和效率分析,并对比它们的优缺点,让读者可以更好地理解和运用它们。 冒泡排序 冒泡排序是最基本、最简单的排序算法,其核心思想是从左往右依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换两…

    算法与数据结构 2023年5月19日
    00
  • 关于Python排序问题(冒泡/选择/插入)

    关于Python排序问题,一般包括冒泡排序、选择排序和插入排序。下面分别进行介绍。 冒泡排序 冒泡排序就是重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复地进行以上操作,直到没有可以交换的元素为止。 示例代码: def bubble_sort(arr): n = len(arr) for i in range(n-1): …

    算法与数据结构 2023年5月19日
    00
  • JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】

    JS前端面试必备——基本排序算法原理与实现方法详解 在前端面试中,算法是一个必考的考点,掌握一些基本的排序算法对于一个前端工程师来说是非常重要的。 排序算法的分类 排序算法可以按照许多不同的标准进行分类: 平均时间复杂度 空间复杂度 稳定性 内部排序和外部排序 在这篇文章中,我们将按照时间复杂度从小到大的顺序介绍以下五个基本的排序算法:插入排序、选择排序、归…

    算法与数据结构 2023年5月19日
    00
  • C++详细讲解图的拓扑排序

    C++详细讲解图的拓扑排序 什么是拓扑排序 拓扑排序是对于有向无环图(Directed Acyclic Graph)的一种排序,其输出结果为图中每个节点的线性先后序列,满足如果存在一条从节点 A 到节点 B 的路径,则在序列中节点 A 出现在节点 B 的前面。 什么是有向无环图(DAG) 有向无环图是不包含环路并且有一个或多个源点和汇点的有向图。其中源点指没…

    算法与数据结构 2023年5月19日
    00
  • 如何用JavaScript学习算法复杂度

    下面是关于如何用JavaScript学习算法复杂度的完整攻略: 1. 什么是算法复杂度? 算法复杂度指的是算法运行时间与输入数据规模之间的关系。通常使用大O表示法来表示算法的时间复杂度,即在最坏情况下,算法需要执行的基本操作次数和输入规模n的关系。从时间复杂度的角度出发,我们可以比较不同的算法及其优劣。 2. JavaScript中如何编写算法 JavaSc…

    算法与数据结构 2023年5月19日
    00
  • TypeScript实现十大排序算法之归并排序示例详解

    TypeScript实现十大排序算法之归并排序示例详解 简介 本文将详细介绍使用 TypeScript 实现归并排序算法的步骤和示例。归并排序是一种非常有效的排序算法,它的时间复杂度为 O(nlogn),在大多数情况下都比快速排序更加稳定和可靠。 步骤 归并排序是一种典型的分治算法,其基本思路是将待排序的数组不断分割为较小的数组,直到每个小数组只有一个元素,…

    算法与数据结构 2023年5月19日
    00
  • redis zset实现滑动窗口限流的代码

    Redis ZSET(有序集合)非常适合实现滑动窗口限流。下面是实现滑动窗口限流的Redis ZSET代码攻略: 步骤一:定义一个键和窗口大小 为了使用Redis ZSET实现滑动窗口限流,您需要为每个限流器定义一个键。键的值将存储在Redis Sorted Set中,并且每个元素将具有其分数。我们将使用时间戳作为分数。此外,需要指定每个限制限流器的窗口大小…

    算法与数据结构 2023年5月19日
    00
  • Python实现选择排序

    当我们需要对一个列表或数组进行排序时,选择排序是一种简单易懂的方法。Python是一种非常流行的编程语言,它可以轻松实现选择排序。 以下是Python实现选择排序的攻略: 选择排序的原理 选择排序是一种简单直观的排序算法,其基本思想是每次选择出最小的元素,放到已经排好序的部分的末尾。 实现步骤 找到未排序部分的最小元素; 将其放在已排序部分的末尾; 重复步骤…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部