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

下面是关于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日

相关文章

  • JavaScript中数组随机排序的实现详解

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

    算法与数据结构 2023年5月19日
    00
  • python 如何在list中找Topk的数值和索引

    对于如何在Python的list中找Topk的数值和索引,可以采用以下方法: 方法一:使用sorted函数排序 可以使用Python内置的sorted函数对list进行排序,然后取前k个元素,同时得到它们的索引。具体代码如下: lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] k = 3 # 记录每个元素的索引和值 lst_wi…

    算法与数据结构 2023年5月19日
    00
  • C语言实现桶排序的方法示例

    C语言实现桶排序的方法示例 桶排序是一种非常高效的排序算法,它的基本思想是将要排序的数据分到几个有序的桶中,每个桶内部再完成排序,最终按照桶的顺序依次连接起来。在本文中,我们将详细讲解如何使用C语言实现桶排序,并提供两个示例来帮助读者更好地理解它的实现过程。 实现步骤 桶排序的实现过程主要分为以下几个步骤: 创建桶:根据待排序数组的最大值和最小值,确定需要创…

    算法与数据结构 2023年5月19日
    00
  • Java中自然排序和比较器排序详解

    Java中自然排序和比较器排序详解 简介 Java中排序分为自然排序和比较器排序两种方式。当对象包含了Comparable接口实现的compareTo方法时,便支持了自然排序。而比较器排序则需要自己实现一个Comparator接口,并传入调用方法中。本文将从以下几个方面详细介绍这两种排序方式: Comparable接口及compareTo方法 Compara…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第一天 七大经典排序【上】

    我会为你详细讲解“算法系列15天速成 第一天 七大经典排序【上】”的完整攻略。 标题 算法系列15天速成 第一天 七大经典排序【上】 内容 本文主要介绍了常用的七大经典排序算法,分别是插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序以及堆排序。对每个算法的特点、实现过程和时间复杂度进行了详细的讲解,同时也对每个算法进行了简单的示例说明。 插入排序 …

    算法与数据结构 2023年5月19日
    00
  • C#几种排序算法

    下面是关于“C#几种排序算法”的详细攻略: C#几种排序算法 概述 排序算法是程序员必须掌握的基本算法之一。在实际应用中,选择合适的排序算法可以显著提高程序的执行效率。这里介绍几种经典的排序算法,并提供相应的C#代码实现。 排序算法简介 冒泡排序 冒泡排序是一种基础的排序算法,思路是将相邻的两个元素进行比较,将较大的元素交换到后面。具体过程是从第一个元素开始…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法之冒泡排序(Bubble Sort)实现方法详解

    PHP排序算法之冒泡排序(Bubble Sort)实现方法详解 冒泡排序概述 冒泡排序是一种基本的排序算法,它的基本思想是比较相邻的两个元素,如果前一个元素比后一个元素大,就交换这两个元素,重复进行这个过程,直到没有任何一对元素需要比较为止。冒泡排序得名于通过交换相邻的元素来把最大值“冒泡”到数列的尽头。 冒泡排序的时间复杂度为O(n²),效率较低,但其思想…

    算法与数据结构 2023年5月19日
    00
  • c++中八大排序算法

    c++中八大排序算法 本文介绍的是C++中八大排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序和计数排序。下面将对这八种算法进行详细讲解。 冒泡排序 冒泡排序(Bubble Sort),是一种简单的排序算法。它重复地遍历要排序的列表,比较每对相邻的项,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行知道没有再需…

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