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

所属分类: 软件编程 / C 语言 阅读数: 91
收藏 0 赞 0 分享

本文实例为大家分享了C++实现双向冒泡排序算法的具体代码,供大家参考,具体内容如下

一、概念(来源于百度百科)

传统冒泡算法原理

冒泡排序算法的运作如下:(从后往前)

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

双向冒泡算法原理

双向冒泡排序算法的运作如下:

1.传统冒泡气泡排序的双向进行,先让气泡排序由左向右进行,再来让气泡排序由右往左进行,如此完成一次排序的动作

2.使用left与right两个旗标来记录左右两端已排序的元素位置。

一个排序的例子如下所示:

排序前:45 19 77 81 13 28 18 19 77 11

往右排序:19 45 77 13 28 18 19 77 11 [81]

向左排序:[11] 19 45 77 13 28 18 19 77 [81]

往右排序:[11] 19 45 13 28 18 19 [77 77 81]

向左排序:[11 13] 19 45 18 28 19 [77 77 81]

往右排序:[11 13] 19 18 28 19 [45 77 77 81]

向左排序:[11 13 18] 19 19 28 [45 77 77 81]

往右排序:[11 13 18] 19 19 [28 45 77 77 81]

向左排序:[11 13 18 19 19] [28 45 77 77 81]

如上所示,括号中表示左右两边已排序完成的部份,当left >= right时,则排序完成。

二、实现程序:

#include <iostream>
#include <ctime>
 
const int MAX = 30;
 
// 交换两个数
void Swap(int &x, int &y) {
  int temp;
  
  temp = x;
  x = y;
  y = temp;
}
 
// 双向冒泡排序
void twoBubbleSort(int arr[], int len) {
  int left, right, shift, i; // shift为记录左右两端已排序的元素位置
  
  left = 0;
  right = len - 1;
  shift = 1;
  while(left < right) { // 往右排序
    for(i = left; i < right; i++) {
      if(arr[i] > arr[i+1]) { // 第一个数比第二个数大,交换
        Swap(arr[i], arr[i+1]);
        shift = i;
      }
    }
    right = shift;
    for(i = right-1; i >= left; i--) { // 向左排序
      if(arr[i] > arr[i+1]) { // 第一个数比第二个数大,交换
        Swap(arr[i], arr[i+1]);
        shift = i + 1;
      }
    }
    left = shift;
  }
}
 
int main(int argc, const char * argv[]) {
  // insert code here...
  int arr[MAX], i;
  
  srand((int)time(NULL)); // 设置时间为随机点
  std::cout << "排序前:";
  for(i = 0; i < MAX; i++) {
    arr[i] = rand() % 100;
    std::cout << arr[i] << " ";
  }
  
  // 调用双向冒泡排序函数
  twoBubbleSort(arr, MAX);
  
  std::cout << "\n排序后:";
  for(i = 0; i < MAX; i++)
    std::cout << arr[i] << " ";
  std::cout << std::endl;
  return 0;
}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多