C语言排序算法之选择排序(直接选择排序,堆排序)

yizhihongxing

C语言排序算法之选择排序

选择排序概述

选择排序是一种简单直观的排序算法,其基本思想是:每一趟从数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列最后,直到全部数据元素排完为止。

选择排序算法的时间复杂度为O(n^2),在数据规模较小时效率较高,但是在数据规模较大时效率较低。

选择排序示例

以下是一个使用选择排序算法对数组进行排序的示例:

#include <stdio.h>

void selection_sort(int arr[], int n)
{
    int i, j, min_idx, temp;

    for (i = 0; i < n - 1; i++)
    {
        min_idx = i;

        //找出剩余未排序元素中最小的一个
        for (j = i + 1; j < n; j++)
        {
            if (arr[j] < arr[min_idx])
            {
                min_idx = j;
            }
        }

        //将找到的最小元素放到已排序序列的末尾
        temp = arr[min_idx];
        arr[min_idx] = arr[i];
        arr[i] = temp;
    }
}

int main(void)
{
    int arr[] = { 64, 25, 12, 22, 11 };
    int n = sizeof(arr) / sizeof(arr[0]);

    selection_sort(arr, n);

    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

输出结果为:

排序后的数组:
11 12 22 25 64 

堆排序概述

堆排序是利用堆这种数据结构设计的一种排序算法。其中堆是一个近似完全二叉树的结构,并同时满足堆特性:即父节点的键值总是大于或小于其子节点的键值。

堆排序算法的时间复杂度为O(nlogn),是效率较高的一种排序算法。

堆排序示例

以下是一个使用堆排序算法对数组进行排序的示例:

#include <stdio.h>

void heapify(int arr[], int n, int i)
{
    int largest = i;
    int l = 2 * i + 1; 
    int r = 2 * i + 2; 

    if (l < n && arr[l] > arr[largest])
    {
        largest = l;
    }

    if (r < n && arr[r] > arr[largest])
    {
        largest = r;
    }

    if (largest != i)
    {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;

        heapify(arr, n, largest);
    }
}

void heap_sort(int arr[], int n)
{
    for (int i = n / 2 - 1; i >= 0; i--)
    {
        heapify(arr, n, i);
    }

    for (int i = n - 1; i >= 0; i--)
    {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;

        heapify(arr, i, 0);
    }
}

int main()
{
    int arr[] = { 12, 11, 13, 5, 6, 7 };
    int n = sizeof(arr) / sizeof(arr[0]);

    heap_sort(arr, n);

    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

输出结果为:

排序后的数组:
5 6 7 11 12 13 

以上就是选择排序和堆排序的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言排序算法之选择排序(直接选择排序,堆排序) - Python技术站

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

相关文章

  • 详解次小生成树以及相关的C++求解方法

    详解次小生成树以及相关的C++求解方法 什么是次小生成树 在普通的生成树中,每个节点只有一条边与其相连。而次小生成树则是指,在所有的生成树中,除了最小生成树之外,权值和第二小的生成树。 求解方法 Kruskal算法 Kruskal算法是一种贪心算法,也是求解最小生成树的常用算法。我们可以对Kruskal算法做一些修改,使其求出次小生成树。 一般情况下,我们需…

    算法与数据结构 2023年5月19日
    00
  • 全排列算法的非递归实现与递归实现的方法(C++)

    全排列算法是计算机科学领域中的一个经典问题,其功能是对给定的一组数进行全排列。在本文中,我们将对该算法的非递归实现和递归实现方法进行详细讲解。本文的代码示例基于C++语言。 非递归实现方法 算法思路 假设我们想对n个数进行全排列,那么我们可以首先将这n个数按照升序排列,然后使用以下步骤: 把这n个数的全排列问题转化为n-1个数的全排列问题; 依次取出每一个数…

    算法与数据结构 2023年5月19日
    00
  • C++选择排序算法实例详解

    C++选择排序算法实例详解 选择排序算法简介 选择排序是一种简单直观的排序算法,其思想是首先找到序列中的最小值,然后将其放到序列的最前面。接着,从剩余序列中找到次小值,将其放到已排序序列的末尾。以此类推,直到排序完成。 选择排序算法的时间复杂度为$O(n^2)$,空间复杂度为$O(1)$,并且由于其算法思想简单,代码实现容易,所以在实际应用中还是比较常见的排…

    算法与数据结构 2023年5月19日
    00
  • Java使用Arrays.sort()方法实现给对象排序

    那么我就来详细讲解一下Java中使用Arrays.sort()方法对对象进行排序的完整攻略。 1.定义一个对象及排序方式 首先,我们需要定义一个对象,并确定排序方式。以一个学生对象为例,假设我们需要按照学生的成绩进行排序,我们需要为这个学生对象定义一个Score属性,然后重写Comparable接口的compareTo()方法。 public class S…

    算法与数据结构 2023年5月19日
    00
  • C++实现堆排序示例

    下面就详细讲解一下“C++实现堆排序示例”的完整攻略。 什么是堆排序 堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。 实现步骤 堆排序主要有两个步骤:构建堆和调整堆。 构建堆 将待…

    算法与数据结构 2023年5月19日
    00
  • C语言完整实现12种排序算法(小结)

    C语言完整实现12种排序算法(小结) 本文主要介绍了C语言实现12种排序算法的详细过程以及相关示例。 排序算法的分类 排序算法可分为内部排序和外部排序。内部排序是指将待排序的数据全部加载到内存中进行排序,而外部排序是指在数据量过大时需要将数据分块,对每一块数据进行排序,最后将各个块合并起来,得到有序的结果。 在内部排序中,常用的排序算法大致可分为以下几类: …

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现快速排序(自已编写)

    下面是详细的讲解JavaScript实现快速排序的完整攻略。 1. 什么是快速排序? 快速排序是一种常用的排序算法,通过分割(partition)和递归分治的思想来快速排序一个数组,在平均情况下它的时间复杂度为 $O(n\log n)$,也是一种不稳定的排序方法。 2. 快速排序的实现过程 2.1 分割 对一个数组进行快速排序的过程就是先将其从中间分割成两部…

    算法与数据结构 2023年5月19日
    00
  • C语言实现交换排序算法(冒泡,快速排序)的示例代码

    C语言实现交换排序算法(冒泡排序、快速排序)通常分为以下步骤: 分析算法:首先,我们需要对选定的排序算法进行仔细的分析,了解排序过程中的基本操作、时间复杂度和空间复杂度等基本信息。 编写函数:依照分析结果,编写函数实现排序算法。同时,考虑如何优化代码以提高排序效率。 测试函数:编写测试代码对排序函数进行测试,检查是否正确。 以下是两个示例说明: 冒泡排序 冒…

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