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

yizhihongxing

基于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排序算法之希尔排序的2个实例

    下面我将详细讲解“JavaScript排序算法之希尔排序的2个实例”的完整攻略。 算法简介 希尔排序(Shell Sort)是插入排序的一种更高效的改进版本,也称为缩小增量排序。它通过在不断缩小步长的序列中对数据进行多轮分组插入排序来进行排序。首先将整个待排序的记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的元素基本有序时,再对全体元素进行一…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之直接选择排序详解

    PHP排序算法系列之直接选择排序详解 一、前言 本文将详细讲解直接选择排序,直接选择排序是一个简单但常用的排序算法,对初学者来说是个很好的入门算法,代码也比较易懂。 二、算法原理 直接选择排序,是一种比较简单直观的排序算法。其基本思想为:将待排序的序列划分为已排序和未排序两部分,从未排序的序列中选择最小的元素,将其插入已排序序列的末尾,直到所有元素均排序完毕…

    算法与数据结构 2023年5月19日
    00
  • Trie树_字典树(字符串排序)简介及实现

    接下来我将详细讲解“Trie树_字典树(字符串排序)简介及实现”的完整攻略。 什么是 Trie 树? Trie 树,也叫字典树,是一种树形数据结构,用于处理字符串匹配、排序等问题。它的特点是能够快速地查找特定前缀或后缀的字符串。 Trie 树的基本实现 Trie 树通常是一棵多叉树,其中根节点不包含任何字符,每个子节点包含一个字符,组成一个完整的字符串。下面…

    算法与数据结构 2023年5月19日
    00
  • 又一个PHP实现的冒泡排序算法分享

    下面我将详细讲解一下“又一个PHP实现的冒泡排序算法分享”的完整攻略。 前言 冒泡排序是一种简单直观的排序方法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。 原理 冒泡排序的原理主要包括以下两个步骤: 比较相邻的元素,如果第一个比第二个大,就交换它们两个; 对每一对相邻元素重复执行步骤 1,直到最后一对元素。这样做…

    算法与数据结构 2023年5月19日
    00
  • 2019年京东前端工程师面试题(附答案)

    本次将会以京东前端工程师面试题为例,详细讲解如何准备和应对前端岗面试。 第一步:了解面试整体流程和考察的技能点 在准备面试前,需要先了解面试的整体流程和所考察的技能点,从而根据需要和缺点来进行有针对性的准备。 面试的整体流程一般包括: 自我介绍和岗位广告 聊聊项目和技术栈 问题解答和技术评测 算法/编码能力测试 HR面试 而在前端工程师的岗位面试中,考察的技…

    算法与数据结构 2023年5月19日
    00
  • JavaScript求解最长回文子串的方法分享

    JS求解最长回文子串的方法分享: 一、前置知识 在学习JS求解最长回文子串之前,你需要掌握以下知识: 严格模式 回文字符串 动态规划 二、什么是回文字符串? 回文字符串是指正着读和倒着读都一样的字符串。例如,’level’、’racecar’、’rotor’ 都是回文字符串。 三、求解最长回文子串的方法 对于字符串中的每一个字符,判断它和它往前的字符组成的子…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第六天 五大经典查找【下】

    算法系列15天速成 第六天 五大经典查找【下】- 完整攻略 简介 本篇文章是算法系列15天速成中的第六天内容,主要是介绍五大经典查找的后三种查找算法:插值查找、斐波那契查找以及分块查找。在介绍每一种查找算法时都会包含具体的思路、复杂度和应用场景等内容。 插值查找 思路 插值查找是在二分查找的基础上优化的一种查找算法,它不是通过数组的中间元素进行查找,而是通过…

    算法与数据结构 2023年5月19日
    00
  • C语言实现冒泡排序算法的示例详解

    C语言实现冒泡排序算法的示例详解 冒泡排序是一种简单但效率较低的排序算法。它重复遍历要排序的数列,每次比较相邻两个元素,如果顺序不对就交换两元素顺序。该算法的时间复杂度为 O(n^2)。 以下是C语言实现冒泡排序的示例代码: #include <stdio.h> int main() { int arr[] = {5, 3, 8, 6, 4}; …

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