基于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数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】

    JavaScript数据结构与算法之基本排序算法定义与效率比较 概述 排序是计算机科学中最常见的操作之一,是将数据按照一定的顺序重新排列的过程。排序算法被广泛应用于搜索、数据压缩、数据库等领域。JavaScript中常用的基本排序算法有3种:冒泡排序、选择排序和插入排序。本文将详细介绍这三种算法的原理、JavaScript实现以及时间复杂度比较。 冒泡排序 …

    算法与数据结构 2023年5月19日
    00
  • C语言实现经典排序算法的示例代码

    对于C语言实现经典排序算法的示例代码,我们可以分为以下几个步骤: 1. 确定排序算法 首先需要明确使用哪种排序算法。常见的排序算法包括:冒泡排序、插入排序、选择排序、快速排序、归并排序等等。每种算法的思想和具体实现方式也有所不同。在确定算法的选择时,需要根据具体的场景和需求来进行选择。 2. 编写排序函数 确定排序算法后,需要实现一个函数用于进行排序。该函数…

    算法与数据结构 2023年5月19日
    00
  • C语言基本排序算法之插入排序与直接选择排序实现方法

    C语言基本排序算法之插入排序与直接选择排序实现方法 本文将介绍C语言中两种常见的基本排序算法:插入排序和直接选择排序。我们将会详细阐述它们的实现方法,并提供示例代码来帮助理解和实践。 插入排序 插入排序是一种简单而常见的排序算法,它将待排序的数列分成已排序和未排序两部分,初始时已排序部分只包含一个元素,随着算法的运行,每次从未排序部分中取出第一个元素插入到已…

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

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

    算法与数据结构 2023年5月19日
    00
  • js实现简单排列组合的方法

    下面是详细讲解 “js实现简单排列组合的方法” 的攻略。 排列组合的概念 排列就是由给定的n个元素中取出m(m ≤ n)个元素的所有排列总数的不同的排列数,用A(n, m)表示。例如,有3个元素A、B、C,则它们的排列有:ABC、ACB、BAC、BCA、CAB、CBA,共6种排列。 组合是指从n个不同元素中,取出m(m≤n)个元素的所有组合情况,用C(n,m…

    算法与数据结构 2023年5月19日
    00
  • c语言冒泡排序法代码

    冒泡排序是常见的排序算法之一,它的基本思想是通过一系列的比较和交换来不断将列表中的最大值或最小值浮到列表的顶部(如冒泡一般),直到整个列表都有序排列。以下是一份c语言版本的冒泡排序代码: void bubbleSort(int arr[], int n){ int i, j; for (i = 0; i < n-1; i++){ for (j = 0;…

    算法与数据结构 2023年5月19日
    00
  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    冒泡排序算法(Bubble Sort) 冒泡排序算法是比较简单的排序算法之一,它通过多次比较和交换相邻两个元素的位置,将整个序列逐步变得有序,因此也被称为“泡沫排序”。 算法步骤: 从序列的第一个元素开始,与第二个元素进行比较,如果第一个元素大于第二个元素,则交换这两个元素; 接着再与第三个元素进行比较,如果第二个元素大于第三个元素,则交换这两个元素; 以此…

    算法与数据结构 2023年5月19日
    00
  • C++STL函数和排序算法的快排以及归并排序详解

    C++ STL函数和排序算法的快排以及归并排序详解 1. 什么是STL? STL(Standard Template Library)是C++标准库中的一部分,它是由若干个模板类和函数构成的集合,提供了一些常用的数据结构和算法。 其中,数据结构包括vector(可变长数组)、list(双向链表)等,算法包括sort(排序)、find(查找)等。 2. STL…

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