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 中对于二叉树数据结构进行添加/删除节点操作的示例代码。二叉树是一种常见的树形结构,在计算机科学领域中被广泛应用。节点的添加与删除是该数据结构中常见的操作之一,本主题将通过示例代码,为您详细介绍操作的过程。 代…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

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

    请听我详细讲解JavaScript中三种常见的排序方法。 什么是排序算法 排序算法是一种基本的算法,用于将一组数据按照某种规则进行排序。在实际开发中,排序算法被广泛应用于数据的处理和管理中。 JavaScript中三种常见的排序方法 在JavaScript中,常见的排序算法有以下三种: 冒泡排序 冒泡排序(Bubble Sort)是一种基本的排序算法,通常通…

    算法与数据结构 2023年5月19日
    00
  • java冒泡排序和选择排序详解

    Java冒泡排序和选择排序详解 冒泡排序 冒泡排序是最简单的排序算法之一,也是入门学习排序算法的基础。该算法的主要思路是从最后一个元素开始,与前面一个元素比较并交换,直到最终将最小元素移动到第一个位置。 冒泡排序实现原理 冒泡排序算法每一轮比较都会将相邻元素中较大或较小的一个元素“冒泡”到待排序序列的最后一个位置。类似于鸡尾酒中的冒泡,所以也叫做“鸡尾酒排序…

    算法与数据结构 2023年5月19日
    00
  • PHP快速排序算法实现的原理及代码详解

    下面我就详细讲解一下“PHP快速排序算法实现的原理及代码详解”的完整攻略。 一、快速排序算法的原理 快速排序(Quicksort)是非常常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的记录关键字小,然后分别对这两部分记录继续进行排序,重复上述过程,直到整个序列有序为止。 具体流程如下: 从数列中挑出一…

    算法与数据结构 2023年5月19日
    00
  • PHP面试常用算法(推荐)

    对于“PHP面试常用算法(推荐)”这一话题,我可以给出一个较为完整的攻略,如下: PHP面试常用算法(推荐) 1.算法的定义 算法(Algorithm)是指解决问题的方法和步骤,也就是解决问题的具体步骤和策略。算法包括很多种,比如常见的排序算法、查找算法、递归算法等等。在 PHP 的面试中,算法是一个非常重要的考察内容,因此熟练掌握各种算法的基本原理和实现方…

    算法与数据结构 2023年5月19日
    00
  • 深入理解JS实现快速排序和去重

    深入理解JS实现快速排序和去重 1.快速排序 快速排序是一种快速并且高效的排序算法。下面是快速排序的步骤: 选择数组中的中心元素作为基准点(pivot) 将所有小于基准点的元素移到基准点的左侧,所有大于基准点的元素移到基准点的右侧 对左右两个子数组递归执行步骤1和步骤2,直到子数组长度为1或0 快速排序可以用以下的JavaScript代码来实现: funct…

    算法与数据结构 2023年5月19日
    00
  • Java 堆排序实例(大顶堆、小顶堆)

    下面我将为您介绍 Java 堆排序实例(大顶堆、小顶堆)的完整攻略。 1. 堆排序介绍 堆排序是一种树形选择排序方法,它的特点是将数组看成一棵完全二叉树,然后通过建立堆(一种特殊的完全二叉树),逐个取出堆顶元素并重新建堆的过程来进行排序。具体来说,堆排序可以分为两种:大顶堆排序和小顶堆排序。 在大顶堆排序中,堆顶元素最大,从小到大进行排序;在小顶堆排序中,堆…

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