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日

相关文章

  • C语言常见排序算法之交换排序(冒泡排序,快速排序)

    交换排序主要有两种:冒泡排序和快速排序。下面我将分别详细介绍这两种排序算法的原理、过程和示例。 冒泡排序 原理 冒泡排序是一种基本的排序方法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复操作直到排序完成。 过程 冒泡排序的过程可以被描述如下: 比较相邻的元素。如果第一个比第二个大,就交换它们两个。 对每一对相邻元素做…

    算法与数据结构 2023年5月19日
    00
  • JAVA中数组从小到大排序的2种方法实例

    JAVA中数组从小到大排序的2种方法实例 在Java中,对数组进行排序是一项常见的任务。本文将介绍Java中数组从小到大排序的两种方法。 方法一:使用Arrays.sort()方法 Arrays.sort()方法可用于对Java中的数组进行排序。排序之后,数组中的元素将按升序排列。 以下是示例代码: import java.util.Arrays; publ…

    算法与数据结构 2023年5月19日
    00
  • C++归并排序算法详解

    C++归并排序算法详解 什么是归并排序 归并排序是一种基于“分治思想”的排序算法,它将待排序的数组不断分割成若干个子数组,直到每个子数组中只有一个元素。然后将那些只有一个元素的子数组归并成两个元素有序的子数组;接着将两个元素有序的子数组再次归并成四个元素有序的子数组;依次类推,直到归并为一个完整的排序数组。 归并排序的流程 1.分解:将待排序的数组从中间分割…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

    算法与数据结构 2023年5月19日
    00
  • JS实现的排列组合算法示例

    下面我将详细讲解一下JS实现的排列组合算法示例的完整攻略。 算法原理 JS实现的排列组合算法主要基于数学组合学,其核心思想是将需要进行排列组合的数据按照一定规则进行排列组合,得到所有可能的排列组合方式。这里我们首先介绍排列与组合的概念: 排列:从n个不同元素中取出m个元素进行排列,按照一定的顺序排列的所有可能的情况被称为排列。其中,n>m。 组合:从n…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法类实例

    让我先给出该攻略的大纲: 算法类的设计思路 冒泡排序算法示例 快速排序算法示例 使用算法类进行排序 接下来,我将详细讲解每一步内容。 1. 算法类的设计思路 首先,我们需要为排序算法创建一个类,这个类应该包含常见排序算法的实现函数。这些函数应该是静态函数,以便我们可以直接访问它们,而不必实例化排序类。 我们还需要实现一些通用的辅助函数,这些函数可以在算法函数…

    算法与数据结构 2023年5月19日
    00
  • JS实现的计数排序与基数排序算法示例

    可能需要先说明一下,计数排序和基数排序都是针对整数排序的算法。 1. 计数排序 计数排序的基本思想是将每个元素出现的次数统计出来,并按顺序排列。计数排序不是基于元素比较的,而是建立在元素的值域范围较小的前提下的。因此,计数排序的时间复杂度是O(n+k),其中k是元素的值域大小。 算法步骤 统计每个数字出现的次数,得到一个长度为k的计数数组。 将计数数组进行变…

    算法与数据结构 2023年5月19日
    00
  • C语言每日练习之选择排序

    C语言每日练习之选择排序 选择排序算法简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思路是在未排序的数列中,从前往后依次选择最小的数,和第一个数进行交换,然后在剩余的数列中从前往后选择最小的数,与第二个数进行交换,直到选择到最后一个数为止。 选择排序的时间复杂度为O(n²),属于较慢的排序算法,但是它的实现简单易懂,不需要额…

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