C语言排序方法(冒泡,选择,插入,归并,快速)

yizhihongxing

下面是关于C语言排序方法冒泡、选择、插入、归并、快速的详细攻略:

冒泡排序

冒泡排序是一种最简单的排序算法,它的核心思想是从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,就交换它们的位置,这样一遍比较后,最大的元素就会被“冒泡”到最右边。然后再对剩余的元素重复同样的操作,这样一直迭代直到整个序列排序完成。

下面是标准的C语言冒泡排序代码示例:

void bubble_sort(int arr[], int len){
    int i, j, temp;
    for (i = 0; i < len - 1; i++){
        for (j = 0; j < len - 1 - i; j++){
            if (arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

上面代码的时间复杂度为$O(n^2)$。下面是一个例子:

排序前: 21 34 11 5 4 2
排序后: 2 4 5 11 21 34

选择排序

选择排序的核心思想是每次从未排定的序列中选择最小的元素,将其和未排定序列的最左边的元素交换位置,这样每一次就使得未排定序列的长度减少1。选择排序的时间复杂度和冒泡排序一样,也是$O(n^2)$。

下面是标准的C语言选择排序代码示例:

void selection_sort(int arr[], int len){
    int i, j, min_idx, temp;
    for (i = 0; i < len - 1; i++){
        min_idx = i;
        for (j = i + 1; j < len; j++){
            if (arr[j] < arr[min_idx]){
                min_idx = j;
            }
        }
        temp = arr[min_idx];
        arr[min_idx] = arr[i];
        arr[i] = temp;
    }
}

下面是一个例子:

排序前: 21 34 11 5 4 2
排序后: 2 4 5 11 21 34

插入排序

插入排序的核心思想是将未排序的元素一个一个地插入到已排序的序列中,插入元素的时候需要保证插入后的序列仍然保持有序。插入排序的时间复杂度也是$O(n^2)$。

下面是标准的C语言插入排序代码示例:

void insertion_sort(int arr[], int len){
    int i, j, key;
    for (i = 1; i < len; i++){
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key){
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

下面是一个例子:

排序前: 21 34 11 5 4 2
排序后: 2 4 5 11 21 34

归并排序

归并排序的核心思想是将原序列通过逐层的细分、合并操作,分割到某一层时,其中的子序列长度为1,则每个子序列都是有序的,然后将相邻的子序列合并,直到整个序列排序完成。归并排序的时间复杂度是$O(nlogn)$,比前面的排序算法要快得多。

下面是标准的C语言归并排序代码示例:

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];
    for (i = 0; i < n1; i++){
        L[i] = arr[l+i];
    }
    for (j = 0; j < n2; j++){
        R[j] = arr[m+1+j];
    }
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2){
        if (L[i] <= R[j]){
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
    while (i < n1){
        arr[k] = L[i];
        i++;
        k++;
    }
    while (j < n2){
        arr[k] = R[j];
        j++;
        k++;
    }
}

void merge_sort(int arr[], int l, int r){
    if (l < r){
        int m = l + (r-l)/2;
        merge_sort(arr, l, m);
        merge_sort(arr, m+1, r);
        merge(arr, l, m, r);
    }
}

下面是一个例子:

排序前: 21 34 11 5 4 2
排序后: 2 4 5 11 21 34

快速排序

快速排序的核心思想是基于分治的思想,在每一次操作时随机选择一个元素作为比较基准,然后将序列中其余的元素根据比较基准的大小分为两个子序列,分别递归地对它们进行排序,最后将它们连接起来即可。快速排序的时间复杂度是$O(nlogn)$。

下面是标准的C语言快速排序代码示例:

int partition(int arr[], int low, int high){
    int pivot = arr[high];
    int i = low - 1;
    int j, temp;
    for (j = low; j <= high-1; j++){
        if (arr[j] < pivot){
            i++;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    temp = arr[i+1];
    arr[i+1] = arr[high];
    arr[high] = temp;
    return i + 1;
}

void quicksort(int arr[], int low, int high){
    if (low < high){
        int pi = partition(arr, low, high);
        quicksort(arr, low, pi - 1);
        quicksort(arr, pi + 1, high);
    }
}

下面是一个例子:

排序前: 21 34 11 5 4 2
排序后: 2 4 5 11 21 34

以上就是C语言常用的几种排序方法的详细讲解,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言排序方法(冒泡,选择,插入,归并,快速) - Python技术站

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

相关文章

  • 图解Java中归并排序算法的原理与实现

    图解Java中归并排序算法的原理与实现 什么是归并排序 归并排序是一种经典的排序算法,它的基本思想是通过将待排序序列不停地划分成两个子序列,将每个子序列排序后再将其合并,直到最终合并为一个有序的序列。 归并排序的原理 划分过程 首先将待排序序列分为两个长度相等的子序列,然后对每个子序列进行排序。 合并过程 合并两个有序的子序列,生成一个有序的子序列。重复此过…

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现插入排序算法及优化

    基于Go语言实现插入排序算法及优化攻略 插入排序算法 插入排序是一种简单直观的排序方法,主要思路是将未排序部分的第一个元素插入到已排序部分合适的位置。具体实现方式如下: func InsertionSort(arr []int) { n := len(arr) for i := 1; i < n; i++ { // 寻找arr[i]合适的插入位置 fo…

    算法与数据结构 2023年5月19日
    00
  • Javascript中的常见排序算法

    Javascript中的常见排序算法 在Javascript中,排序算法是非常基础和常见的算法之一,也是大多数编程语言都会涉及到的一部分。在实际应用场景中,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。 冒泡排序 冒泡排序是一种简单易懂的排序算法,其中每一趟都按照从前往后的顺序比较两个相邻的元素,如果前一个元素大于后一个元素,则交换这…

    算法与数据结构 2023年5月19日
    00
  • PHP冒泡排序算法代码详细解读

    PHP冒泡排序算法代码详细解读 什么是冒泡排序? 冒泡排序是一种简单的排序算法,通过交换相邻元素比较和交换的方式进行排序。该算法会重复遍历待排序的数列,每次比较相邻的两个元素,如果顺序错误就交换位置。重复执行这个过程,直到整个数列有序。 算法实现过程 以下是基于PHP语言实现的冒泡排序代码,对应的注释为算法的实现过程说明。 function bubbleSo…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数组排序的六种常见算法总结

    JavaScript数组排序的六种常见算法总结 一、排序算法简介 排序算法是计算机学科中最基本的算法之一,也是编程中必须要了解的重要内容。在JavaScript编程中,排序算法的应用非常广泛,尤其是在处理和展现数据方面。 二、排序算法分类 根据不同的排序方式和算法思想, 排序算法可以被分类为以下六类。 冒泡排序 选择排序 插入排序 快速排序 归并排序 希尔排…

    算法与数据结构 2023年5月19日
    00
  • TypeScript调整数组元素顺序算法

    下面是详细的攻略: TypeScript调整数组元素顺序算法 在 TypeScript 中实现调整数组元素顺序的算法需要使用到以下两种方法: 方法一:splice() array.splice(startIndex, toRemove, …itemsToAdd) splice() 方法可以实现对数组中指定起始索引 startIndex 开始的若干元素的删…

    算法与数据结构 2023年5月19日
    00
  • C语言 扩展欧几里得算法代码

    下面我来为你详细讲解一下“C语言 扩展欧几里得算法代码”的完整攻略。 什么是扩展欧几里得算法? 扩展欧几里得算法是求解两个整数 a、b 的最大公约数(Greatest Common Divisor,简称 GCD)的一种算法。该算法可以不仅计算出最大公约数,还可以得到一组关于 a、b 的贝祖等式的整数解和一些运算过程。 算法流程 扩展欧几里得算法的流程如下: …

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现冒泡排序算法

    基于Go语言实现冒泡排序算法 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,因而得名“冒泡排序”。该算法因其简单的实现方式和易于理解的原理而广泛应用。 冒泡排序算法实现方式 冒泡排序的算法原理如下: 比较相邻的元素。如果第一个…

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