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

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++超详细讲解贪心策略的设计及解决会场安排问题 什么是贪心算法 贪心算法是一种近似算法,通常用于求解最优化问题。在每一步,贪心算法总是做出在当前看来最优的选择,并希望通过这样的选择最终能达到全局最优。 解决会场安排问题的贪心策略 问题描述 为了方便会议的安排,需要一个会议室来容纳所有的会议。现在有n个会议需要在会议室中安排,假设每个会议被安排在一个时间段内…

    算法与数据结构 2023年5月19日
    00
  • TypeScript十大排序算法插入排序实现示例详解

    针对“TypeScript十大排序算法插入排序实现示例详解”的完整攻略,我有如下的描述和示例: 1. 算法简介 插入排序(Insertion Sort)是一种简单直观的排序算法。它的基本思想是将目标数组分为已排序和未排序区间,每次从未排序区间中选取一个元素并插入到已排序区间中正确的位置。 插入排序是一种相对基础的排序算法,不仅实现起来比较简单,而且时间复杂度…

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

    C++ 计数排序实例详解 简介 计数排序是一种稳定的排序算法,其时间复杂度为O(n + k),其中n为待排序序列的长度,k为序列中元素的取值范围。相比其他排序算法,计数排序的时间复杂度较小,但需要占用更多的内存空间。计数排序在排序的元素值比较小,且元素集合密集程度比较大的场景下表现更加出色。 算法原理 计数排序的基本思想是,统计待排序序列中,每个元素出现的个…

    算法与数据结构 2023年5月19日
    00
  • java 排序算法之快速排序

    Java 排序算法之快速排序 快速排序(Quick Sort)是一种高效的排序算法,属于分治法(Divide and Conquer)策略,它的时间复杂度为 $O(nlogn)$,在大多数情况下可以达到线性级别的时间复杂度,是非常重要且常用的排序算法之一。 基本思想 快速排序算法的基本思路是:选择一个元素作为数组的 “基准”(pivot),将小于基准的元素放…

    算法与数据结构 2023年5月19日
    00
  • 排序算法之PHP版快速排序、冒泡排序

    排序算法之PHP版快速排序、冒泡排序 在算法和数据结构中,排序是一种重要的操作,主要目的是将一组无序的数据按照一定的规则进行排序。常见的排序算法有冒泡排序、快速排序、归并排序等。本文将详细介绍php版本的快速排序和冒泡排序的实现。 冒泡排序 冒泡排序是一种最简单的排序算法之一。其思想是从数组的第一个元素开始比较,将大的元素交换到后面,依次比较下去,直到排序完…

    算法与数据结构 2023年5月19日
    00
  • js算法中的排序、数组去重详细概述

    JS算法中的排序、数组去重详细概述 排序算法 在JavaScript中,常用的排序算法有冒泡排序、插入排序、选择排序、快速排序等。下面将分别对他们进行介绍。 冒泡排序 冒泡排序是一种稳定的排序算法,它的基本思想是从左到右依次比较相邻两个元素的大小,并且将较大的元素向右移动,较小的元素向左移动。重复这个过程直到没有任何元素需要移动为止。 下面是冒泡排序的Jav…

    算法与数据结构 2023年5月19日
    00
  • JS实现的数组全排列输出算法

    JS实现的数组全排列输出算法,一般使用递归实现,具体步骤如下: 步骤一:编写递归函数 首先我们需要定义一个递归函数 permutation,它的输入参数为两个数组: function permutation(arr, result = []) { // … } 其中,arr 是待排列的数组,result 是排列结果。注意,result 是一个可选参数,第…

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

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

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