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日

相关文章

  • JS中多层次排序算法的实现代码

    让我为你介绍一份JS中多层次排序算法的实现代码攻略。 简介 多层次排序是指一个列表需要依据不同的规则进行排序,例如按照价格、销量、评分等进行排序。在JS中,我们可以通过自定义排序函数实现多层次排序。 实现 以下是实现多层次排序的示例代码: const products = [ { name: ‘iPhone 11’, price: 799, sales: 1…

    算法与数据结构 2023年5月19日
    00
  • C#算法之全排列递归算法实例讲解

    C#算法之全排列递归算法实例讲解 什么是全排列? 全排列是指将一个给定的集合中的元素进行排列,使得每个元素只出现一次,且每个元素在排列中的位置是不确定的,从而得到的所有不同排列。比如给定集合{1, 2, 3}的全排列包括{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 递归算法实现全排列…

    算法与数据结构 2023年5月19日
    00
  • 堆排序算法(选择排序改进)

    堆排序算法是一种基于二叉堆的选择排序改进算法。它利用了二叉堆的特点,可以将排序时间降至O(nlogn)级别。下面我们来详细讲解它的完整攻略。 基本思路 将待排序的序列构建成一个最大堆。 将堆顶的元素(即当前最大元素)跟数组最后一个元素交换位置,然后将剩余的元素进行堆调整,使其满足最大堆的要求。 重复步骤2,直至排序完成。 步骤详解 1. 构建最大堆 对于一个…

    算法与数据结构 2023年5月19日
    00
  • JS常用排序方法实例代码解析

    JS常用排序方法实例代码解析 在 JavaScript 中,有很多种排序方法可以使用。本文将介绍常用的四种排序方法及其实例代码,包括冒泡排序、选择排序、插入排序和快速排序。 冒泡排序 冒泡排序是一种简单、但效率低下的排序算法。基本思路是将相邻的两个数进行比较,如果前面的数比后面的数大,则交换这两个数的位置,一直重复这个过程,直到最后一个数是最大数为止。 fu…

    算法与数据结构 2023年5月19日
    00
  • go实现冒泡排序算法

    下面是详细讲解Go语言实现冒泡排序算法的完整攻略: 1. 什么是冒泡排序? 冒泡排序是一种基于交换的排序算法,算法通过比较相邻的元素,将比较大的元素交换到后面,从而达到排序的目的。这个过程就像是水中不断上冒的气泡,因此称之为冒泡排序。 冒泡排序是经典的排序算法之一,它虽然时间复杂度高达 O(n^2),但其思想简单,易于理解和实现,并且在某些特殊的情况下,它的…

    算法与数据结构 2023年5月19日
    00
  • C语言实现文件内容按行随机排列的算法示例

    下面我将为您详细介绍“C语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

    算法与数据结构 2023年5月19日
    00
  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    冒泡排序算法(Bubble Sort) 冒泡排序算法是比较简单的排序算法之一,它通过多次比较和交换相邻两个元素的位置,将整个序列逐步变得有序,因此也被称为“泡沫排序”。 算法步骤: 从序列的第一个元素开始,与第二个元素进行比较,如果第一个元素大于第二个元素,则交换这两个元素; 接着再与第三个元素进行比较,如果第二个元素大于第三个元素,则交换这两个元素; 以此…

    算法与数据结构 2023年5月19日
    00
  • JS折半插入排序算法实例

    下面是介绍JS折半插入排序算法的完整攻略。 什么是折半插入排序算法? 折半插入排序是插入排序的一种改进算法,它的基本思路是利用二分查找找到某个待排元素在已排序序列中插入位置。 折半插入排序算法的时间复杂度为 O(nlogn),比普通插入排序 O(n^2)快。 折半插入排序算法实现步骤 折半插入排序算法的实现步骤如下: 从第二个元素开始,将整个序列分为已排序区…

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