基于C++实现的各种内部排序算法汇总

基于C++实现的各种内部排序算法汇总

概述

本攻略汇总了常见的基于C++实现的内部排序算法,包括选择排序、冒泡排序、插入排序、希尔排序、归并排序、快速排序、堆排序。以下是算法的具体实现过程。

选择排序

选择排序的核心思想是每次找到未排序序列中的最小值,然后放到已排序序列的末尾。具体实现过程如下:

void selection_sort(vector<int>& nums) {
    int n = nums.size();
    for (int i = 0; i < n - 1; i++) {
        int min_index = i;
        for (int j = i + 1; j < n; j++) {
            if (nums[j] < nums[min_index]) {
                min_index = j;
            }
        }
        swap(nums[min_index], nums[i]);
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
selection_sort(nums);
// nums: {1, 2, 3, 4, 5}

冒泡排序

冒泡排序的核心思想是从未排序序列中不断交换相邻元素,直到将最大元素放到已排序序列的末尾。具体实现过程如下:

void bubble_sort(vector<int>& nums) {
    int n = nums.size();
    for (int i = 0; i < n - 1; i++) {
        bool flag = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (nums[j] > nums[j + 1]) {
                swap(nums[j], nums[j + 1]);
                flag = true;
            }
        }
        if (!flag) {
            break;
        }
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
bubble_sort(nums);
// nums: {1, 2, 3, 4, 5}

插入排序

插入排序的核心思想是将未排序序列中的元素依次插入到已排序序列中的合适位置。具体实现过程如下:

void insertion_sort(vector<int>& nums) {
    int n = nums.size();
    for (int i = 1; i < n; i++) {
        int j = i - 1;
        int temp = nums[i];
        while (j >= 0 && nums[j] > temp) {
            nums[j + 1] = nums[j];
            j--;
        }
        nums[j + 1] = temp;
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
insertion_sort(nums);
// nums: {1, 2, 3, 4, 5}

希尔排序

希尔排序是插入排序的改进版。它将序列按照一定间隔分组,对每组进行插入排序,然后逐步缩小间隔直到为1,最后再进行一次插入排序。具体实现过程如下:

void shell_sort(vector<int>& nums) {
    int n = nums.size();
    int gap = n / 2;
    while (gap > 0) {
        for (int i = gap; i < n; i++) {
            int j = i - gap;
            int temp = nums[i];
            while (j >= 0 && nums[j] > temp) {
                nums[j + gap] = nums[j];
                j -= gap;
            }
            nums[j + gap] = temp;
        }
        gap /= 2;
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
shell_sort(nums);
// nums: {1, 2, 3, 4, 5}

归并排序

归并排序的核心思想是将序列分成两部分,对每部分分别进行排序,然后再将两部分合并。具体实现过程如下:

void merge(vector<int>& nums, int l, int m, int r) {
    vector<int> sorted(r - l + 1);
    int i = l, j = m + 1, k = 0;
    while (i <= m && j <= r) {
        if (nums[i] < nums[j]) {
            sorted[k++] = nums[i++];
        } else {
            sorted[k++] = nums[j++];
        }
    }
    while (i <= m) {
        sorted[k++] = nums[i++];
    }
    while (j <= r) {
        sorted[k++] = nums[j++];
    }
    for (int i = l, k = 0; i <= r; i++, k++) {
        nums[i] = sorted[k];
    }
}

void merge_sort(vector<int>& nums, int l, int r) {
    if (l < r) {
        int m = (l + r) / 2;
        merge_sort(nums, l, m);
        merge_sort(nums, m + 1, r);
        merge(nums, l, m, r);
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
merge_sort(nums, 0, nums.size() - 1);
// nums: {1, 2, 3, 4, 5}

快速排序

快速排序的核心思想是选择一个基准元素,将比它小的元素放在左边,比它大的元素放在右边,然后再分别对左右部分进行排序。具体实现过程如下:

int partition(vector<int>& nums, int l, int r) {
    int pivot = nums[r];
    int i = l;
    for (int j = l; j < r; j++) {
        if (nums[j] < pivot) {
            swap(nums[i], nums[j]);
            i++;
        }
    }
    swap(nums[i], nums[r]);
    return i;
}

void quick_sort(vector<int>& nums, int l, int r) {
    if (l < r) {
        int p = partition(nums, l, r);
        quick_sort(nums, l, p - 1);
        quick_sort(nums, p + 1, r);
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
quick_sort(nums, 0, nums.size() - 1);
// nums: {1, 2, 3, 4, 5}

堆排序

堆排序的核心思想是将序列看成一颗完全二叉树,每个节点的值不大于它的子节点的值,将其称为小根堆。堆排序的过程就是不断将堆顶元素与最后一个元素交换,然后将剩下的序列重新构建成小根堆。具体实现过程如下:

void heapify(vector<int>& nums, int n, int i) {
    int largest = i;
    int l = 2 * i + 1, r = 2 * i + 2;
    if (l < n && nums[l] > nums[largest]) {
        largest = l;
    }
    if (r < n && nums[r] > nums[largest]) {
        largest = r;
    }
    if (largest != i) {
        swap(nums[i], nums[largest]);
        heapify(nums, n, largest);
    }
}

void heap_sort(vector<int>& nums) {
    int n = nums.size();
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(nums, n, i);
    }
    for (int i = n - 1; i >= 0; i--) {
        swap(nums[0], nums[i]);
        heapify(nums, i, 0);
    }
}

示例:

vector<int> nums = {3, 2, 1, 5, 4};
heap_sort(nums);
// nums: {1, 2, 3, 4, 5}

结语

以上便是常见的基于C++实现的内部排序算法。这些算法在不同的场景下有着不同的适用性,需要根据具体情况选择合适的算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C++实现的各种内部排序算法汇总 - Python技术站

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

相关文章

  • 利用JavaScript实现的10种排序算法总结

    作为“利用JavaScript实现的10种排序算法总结”的作者,首先需要明确以下内容: 熟悉10种排序算法的原理与流程 理解JavaScript作为一门编程语言的特点和应用场景 知道如何将算法的流程用JavaScript代码实现 针对以上内容,可以采取以下步骤: 梳理10种排序算法的流程和实现方式,用markdown文本形式编写对应的标题和文本,例如: 插入…

    算法与数据结构 2023年5月19日
    00
  • 级联分类器算法原理解析

    级联分类器算法原理解析 级联分类器算法(Cascade Classifier)是一种应用广泛的计算机视觉算法,主要用于目标检测(Object Detection)。其主要思想是利用一系列分类器进行级联,当目标通过所有的分类器才会被识别,从而提高了目标检测的准确率和效率。本文将详细讲解级联分类器算法的原理、特点和使用步骤,并且提供两个示例说明。 级联分类器算法…

    算法与数据结构 2023年5月19日
    00
  • 如何利用Python动态展示排序算法

    首先,我们需要了解一下Python中常用的用于动态展示的库——matplotlib和pygame。 matplotlib是一个数据可视化库,它可以让我们轻松地创建各种静态和动态的图形,包括折线图、柱形图等等,而pygame则是一个开源的游戏开发库,它专用于创建游戏和动态图形。 接下来,我们就可以使用这两个库来展示排序算法了。 下面是一个示例,展示了如何使用m…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言中的结构体快排算法

    C语言中的结构体快排算法 在C语言中,复杂的数据类型可以通过结构体定义。结构体是一种自定义类型,可以由不同类型的变量组成。快速排序算法是一种高效的排序算法,通过十分巧妙的算法思想,可以在平均$O(nlogn)$的时间复杂度内完成数组的排序。对于结构体类型的排序,在快速排序算法中也可以使用。本文主要讲解如何在C语言中使用结构体进行快排排序。 快速排序算法 快速…

    算法与数据结构 2023年5月19日
    00
  • javascript基本常用排序算法解析

    让我来为您详细讲解“JavaScript基本常用排序算法解析”的完整攻略。 一、前言 排序算法是计算机科学中最常用的算法之一。它可以将我们需要排序的数据快速进行排序,加速我们的代码算法运行速度。在本篇文章中,我们将给您介绍一些基本的、常用的排序算法。 二、常用排序算法 冒泡排序 冒泡排序是一种比较简单但实用的排序算法,也是最基本的排序算法之一。它的基本思想是…

    算法与数据结构 2023年5月19日
    00
  • c#实现选择排序的示例

    C#实现选择排序主要包含以下步骤: 定义数组 遍历数组,选出最小元素,并记录其索引 交换当前索引和最小值索引的元素 循环执行步骤2和步骤3,直到整个数组排序完成 以下是实现选择排序的C#示例: 示例1: int[] arr = new int[]{5, 3, 9, 1, 7, 4}; for (int i = 0; i <arr.Length; i++…

    算法与数据结构 2023年5月19日
    00
  • PHP有序表查找之二分查找(折半查找)算法示例

    下面我将对“PHP有序表查找之二分查找(折半查找)算法示例”的完整攻略进行详细讲解。 一、什么是二分查找 二分查找又称为折半查找,是一种在有序数组中查找某一特定元素的搜索算法。基本思想是:将有序数组分成两部分,如果要查找的元素比数组中间的元素小,则在左半部分继续查找;如果要查找的元素比数组中间的元素大,则在右半部分继续查找,直到找到或者查找结束。 二分查找算…

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