C++实现双向冒泡排序算法

C++实现双向冒泡排序算法

算法介绍

双向冒泡排序,也称为鸡尾酒排序或定向冒泡排序,是冒泡排序的改进版本。其基本思路与冒泡排序相同,不同之处在于每次排序时同时从数组两侧开始,分别向中间移动。这种方法能够更快地将大数和小数分别冒泡到数组的两端,从而减少了排序次数,提高了排序效率。

下面是双向冒泡排序的具体步骤:
1. 从左往右进行一轮冒泡排序,将最小的数排到数组的最左边;
2. 从右往左进行一轮冒泡排序,将最大的数排到数组的最右边;
3. 重复上述步骤,直到数组有序。

C++代码实现

以下是用C++语言实现双向冒泡排序算法的代码,其中参数arr为待排序的数组,参数n为数组长度。

void CocktailSort(int arr[], int n) {
    bool flag = true;
    int left = 0, right = n - 1;
    while (flag) {
        flag = false;
        // 从左往右
        for (int i = left; i < right; i++) {
            if (arr[i] > arr[i+1]) {
                swap(arr[i], arr[i+1]);
                flag = true;
            }
        }
        right--;
        // 从右往左
        for (int i = right; i > left; i--) {
            if (arr[i] < arr[i-1]) {
                swap(arr[i], arr[i-1]);
                flag = true;
            }
        }
        left++;
    }
}

示例说明

下面通过两个示例说明双向冒泡排序的具体应用。

示例1:从小到大排序

#include <iostream>
using namespace std;

int main() {
    int arr[] = {23, 56, 12, 67, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    cout << "排序前:" << endl;
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    CocktailSort(arr, n);

    cout << "排序后:" << endl;
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

排序前:
23 56 12 67 9 
排序后:
9 12 23 56 67

示例2:从大到小排序

#include <iostream>
using namespace std;

int main() {
    int arr[] = {23, 56, 12, 67, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    cout << "排序前:" << endl;
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    CocktailSort(arr, n);

    cout << "排序后:" << endl;
    for (int i = n-1; i >= 0; i--) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

排序前:
23 56 12 67 9 
排序后:
67 56 23 12 9

通过以上两个示例,可以看出双向冒泡排序算法对于不同的排序要求可以进行灵活的应用,并且比冒泡排序更加高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现双向冒泡排序算法 - Python技术站

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

相关文章

  • C语言中数组排序浅析

    C语言中数组排序浅析 前言 在C语言中,数组排序是一项非常基础且实用的技能。它可以帮助我们将一个未排序的数组变为有序的,这样方便我们进行各种操作,比如查找、去重、统计频率等等。在本文中,我们将浅析C语言中数组排序的几种方法以及它们的优缺点。 冒泡排序 冒泡排序是一种比较简单易懂的排序方法,在很多初学者的教程中都有涉及。该算法的基本思想是将相邻的元素比较,如果…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言排序方法(冒泡,选择,插入,归并,快速)

    下面是关于C语言排序方法冒泡、选择、插入、归并、快速的详细攻略: 冒泡排序 冒泡排序是一种最简单的排序算法,它的核心思想是从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,就交换它们的位置,这样一遍比较后,最大的元素就会被“冒泡”到最右边。然后再对剩余的元素重复同样的操作,这样一直迭代直到整个序列排序完成。 下面是标准的C语言冒泡排序代码示例: …

    算法与数据结构 2023年5月19日
    00
  • javascript笛卡尔积算法实现方法

    JavaScript笛卡尔积算法实现方法 什么是笛卡尔积 笛卡尔积是指给定多个集合,每个集合中分别选取一个元素组成的所有可能组合的集合。例如,有两个集合 X={1,2} 和 Y={3,4},那么它们的笛卡尔积为 {(1,3), (1,4), (2,3), (2,4)}。 实现笛卡尔积算法 JavaScript实现笛卡尔积算法的过程可以分为以下三步: 遍历所有…

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

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

    算法与数据结构 2023年5月19日
    00
  • java冒泡排序简单实例

    下面我来详细讲解一下“Java冒泡排序简单实例”的完整攻略。 简介 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就将它们交换过来。重复上述步骤直到整个数列都有序为止。 实现步骤 首先,我们需要定义一个整型数组,用于存储待排序的数据。 int[] array = {5, 3, 8, 6, 4}; 定义一个…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】

    下面我将为您详细讲解“PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】”的完整攻略。 什么是字符串逆序排列? 字符串逆序排列指的是将一个字符串中的字符按照相反的顺序重新排列,比如将字符串 “hello world” 更改为 “dlrow olleh”。 使用strrev函数实现字符串逆序排列 PHP内置函数 strrev() 可以…

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