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

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日

相关文章

  • Go归并排序算法的实现方法

    Go归并排序算法的实现方法 简介 归并排序(Merge Sort)是一种经典的分治算法,它将一个大问题分解为若干个小问题,通过递归将小问题排好序,最后再将小问题合并起来,得到排序的结果。 归并排序的最坏时间复杂度为$ O(nlogn)$,且具有稳定性,是较为优秀的排序算法之一。 实现方法 归并排序的实现分为两个步骤,分别是分解和合并: 分解 分解过程需要递归…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中数组随机排序的实现详解

    下面是我对于“JavaScript中数组随机排序的实现详解”的完整攻略。 概述 在JavaScript中,数组是一个非常有用的数据类型,而随机排序是在处理数组时非常实用的一种技术。本攻略将为你详细讲解如何实现JavaScript数组的随机排序。 方法一:使用sort()方法 JavaScript中的数组包含一个sort()方法,可以对数组中的元素进行排序。我…

    算法与数据结构 2023年5月19日
    00
  • PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】

    下面我将为您详细讲解“PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】”的完整攻略。 什么是字符串逆序排列? 字符串逆序排列指的是将一个字符串中的字符按照相反的顺序重新排列,比如将字符串 “hello world” 更改为 “dlrow olleh”。 使用strrev函数实现字符串逆序排列 PHP内置函数 strrev() 可以…

    算法与数据结构 2023年5月19日
    00
  • Python实现堆排序案例详解

    Python实现堆排序案例详解 堆排序简介 堆排序是一种基于树形数据结构的排序算法,它的时间复杂度为 O(nlogn),堆排序分为大根堆和小根堆,当堆为大根堆时,堆中每个节点的值都大于或等于其孩子节点的值,当堆为小根堆时,堆中每个节点的值都小于或等于其孩子节点的值。 堆的基本概念 堆是一种完全二叉树,它可以用数组来表示,数组下标从 1 开始,对于下标为 i …

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言基本排序算法之插入排序与直接选择排序实现方法

    C语言基本排序算法之插入排序与直接选择排序实现方法 本文将介绍C语言中两种常见的基本排序算法:插入排序和直接选择排序。我们将会详细阐述它们的实现方法,并提供示例代码来帮助理解和实践。 插入排序 插入排序是一种简单而常见的排序算法,它将待排序的数列分成已排序和未排序两部分,初始时已排序部分只包含一个元素,随着算法的运行,每次从未排序部分中取出第一个元素插入到已…

    算法与数据结构 2023年5月19日
    00
  • C语言排序算法之选择排序(直接选择排序,堆排序)

    C语言排序算法之选择排序 选择排序概述 选择排序是一种简单直观的排序算法,其基本思想是:每一趟从数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列最后,直到全部数据元素排完为止。 选择排序算法的时间复杂度为O(n^2),在数据规模较小时效率较高,但是在数据规模较大时效率较低。 选择排序示例 以下是一个使用选择排序算法对数组进行排序的示例: #in…

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