排序算法的c++实现——冒泡排序
冒泡排序
冒泡排序是我们大多数人接触到的第一种排序算法,原理简单易懂,不多解释。说明三点:
1. 冒泡排序是稳定排序,只有当两个元素不同时才会交换;
2. 冒泡排序是原址排序,不需要借助额外的空间;
3. 冒泡排序通常见到的都是通过循环来实现的,其实通过递归来实现更简洁。
4. 冒泡排序的时间复杂度为O(N*N)
代码如下所示:
/***********************************************************************
* Copyright (C) 2019 Yinheyi. <chinayinheyi@163.com>
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version. * Brief:
* Author: yinheyi
* Email: chinayinheyi@163.com
* Version: 1.0
* Created Time: 2019年05月08日 星期三 21时53分25秒
* Modifed Time: 2019年05月08日 星期三 23时48分18秒
* Blog: http://www.cnblogs.com/yinheyi
* Github: https://github.com/yinheyi
*
***********************************************************************/ // 对于冒泡排序,这肯定是大家接触编程时第一个碰到的排序算法。
// 原理很简单: 以从小到大排序为例,假设一个数组的长度为n, 则:
// 第一次: 从数组尾部开始向前, 两两元素之间进行比较, 共比较n-1次,就可以把最小元素移
// 动到数组下标为0的地方, 此时有1个排序完成, 剩余n-1个还没有排序。
// 第二次:还是从数组尾部开始向前,两两元素之间进行比较, 共比较n-2次,就可以把剩余的
// 元素中最小的元素移动到数组下标为1的地方,此时有2个元素排序完成,剩余n-2还没有排序。
// 第三次: 重复以上过程。
//
// 原始 第一次 第二次 第三次 第四次 第五次
// 3 -12 -12 -12 ... ...
// 2 3 1 1
// 8 2 3 1
// 1 8 2 3
// -12 1 8 2
// 32 1 1 8
// 1 32 32 32
//
//
// 说明:1. 冒泡排序是稳定排序,只有当两个元素不同时才会交换;
// 2. 冒泡排序通常见到的都是通过循环来实现的,其实通过递归来实现更简洁。
// 3. 冒泡排序的时间复杂度为O(N*N)
//
//
bool less(int lhs, int rhs);
bool greate(int lhs, int rhs);
static inline void swap(int& lhs, int & rhs);
void PrintArray(int array[], int nLength_);
typedef bool (*Comp)(int, int); // 基于循环来实现的冒泡排序:
void BubbleSort_Loop(int array[], int nLength_, Comp CompFunc)
{
if (array == nullptr || nLength_ <= || CompFunc == nullptr)
return; // 对于n个元素,只需要排前n-1个元素即可, 即下标为0, 1, 2, ..., n-2的元素。
for (int i = ; i < nLength_ - ; ++i)
{
// 如果要使下标为i的元素变成有序的,需要从数组尾部开始两两交换,直至交换到i
for (int j = nLength_ - ; j > i; --j)
{
if (!CompFunc(array[j-], array[j]))
{
swap(array[j-], array[j]);
}
}
}
} // 基于递归来实现冒泡排序:
void BubbleSort_Recursion(int array[], int nLength_, Comp CompFunc)
{
if (array == nullptr || nLength_ <= || CompFunc == nullptr)
return; // 从数组尾部向前,对不符合要求的元素进行两两交换,从而使数组头部的元素为最小或最大
for (int i = nLength_ - ; i > ; --i)
{
if (!CompFunc(array[i-], array[i]))
{
swap(array[i-], array[i]);
}
} // 对数组剩余的元素进行递归操作
BubbleSort_Recursion(array + , nLength_ - , CompFunc);
} // 小小的测试
#include <iostream>
/*************** main.c *********************/
int main(int argc, char* argv[])
{
int test1[] = {-, -, , , -, , , , , };
std::cout << "原顺序为:" << std::endl;
PrintArray(test1, ); std::cout << "基于循环的从小到大排序:" << std::endl;
BubbleSort_Loop(test1, , less);
PrintArray(test1, );
std::cout << "基于循环的从大到小排序:" << std::endl;
BubbleSort_Loop(test1, , greate);
PrintArray(test1, ); std::cout << "基于递归的从小到大排序:" << std::endl;
BubbleSort_Recursion(test1, , less);
PrintArray(test1, );
std::cout << "基于递归的从大到小排序:" << std::endl;
BubbleSort_Recursion(test1, , greate);
PrintArray(test1, ); return ;
} // 小于比较函数
bool less(int lhs, int rhs)
{
return lhs < rhs;
} // 大于比较函数
bool greate(int lhs, int rhs)
{
return lhs > rhs;
} // 交换两个元素的值
static inline void swap(int& lhs, int & rhs)
{
int _nTemp = lhs;
lhs = rhs;
rhs = _nTemp;
} // 打印数组函数
void PrintArray(int array[], int nLength_)
{
if (nullptr == array || nLength_ <= )
return; for (int i = ; i < nLength_; ++i)
{
std::cout << array[i] << " ";
} std::cout << std::endl;
}
排序算法的c++实现——冒泡排序的更多相关文章
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 排序算法c语言描述---冒泡排序
排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...
- 使用Erlang实现简单的排序算法:快速排序,冒泡排序,插入排序
[排序算法] -module(sort). -compile(export_all). %%快速排序 qsort([]) -> []; qsort([Pivot|T]) -> qsort( ...
- 三、排序算法总结一(冒泡排序,插入排序,选择排序)(C++版本)
一.引言 对于各种排序算法也算是有了一定的了解,所以这里做一个总结. 二.冒泡排序法. 这是比较经典的排序算法,主要是通过内外两层的循环比较,使得乱序变为顺序. 下面是一个测试代码 #include ...
- 排序算法Java实现(冒泡排序)
算法描述:对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和交换后,n个记录中的最大记录将位于第n位:然后对前(n-1)个记录进行 ...
- JAVA排序算法(一)冒泡排序、选择排序
/* 冒泡排序 * * 相邻的元素,两两比较.如果第一个比第二个大,就交换他们两个. 大的后移 * 对每一对相邻元素做同样的工作,这样第一轮结束后,最大值在最后一个. */ public static ...
- Java排序算法(一)冒泡排序
一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...
随机推荐
- LeetCode 1216. Valid Palindrome III
原题链接在这里:https://leetcode.com/problems/valid-palindrome-iii/ 题目: Given a string s and an integer k, f ...
- Windbg Scratch Pad(便笺簿)窗口的使用
“便笺簿”窗口是一个剪贴板,您可以在其中键入和保存文本. 打开便笺簿 通过菜单View--->Scratch Pad 通过快捷键Alt+8 通过工具栏 使用便笺簿 用上面的方式打开的窗口如下: ...
- selenium篇之滑动验证码
一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...
- 团体项目(饱了嘛)_第一组_UML图
UML图 需求分析报告 https://www.cnblogs.com/Clover-yee/p/11771395.html 类图 user(用户类):主要保存用户的基本信息 shop(商铺类):主要 ...
- 终于有人把elasticsearch原理讲通了
转自 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 随着央视诗词大会的热播,小史开始对诗词感兴趣,最喜欢的就是飞花令的环节. 但是由于小史很 ...
- JOI徽章
[题目描述] 日本信息学奥赛委员会为了应援将要去台湾参加 IOI 的选手们,打算制作一面新的 JOI 旗帜 .JOI 旗帜为由 M 行 N 列的 M*N 个正方形组 成的图形,每个正方形里写有 J,O ...
- The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解
(施工中……已更新DF) 比赛传送门:https://www.jisuanke.com/contest/3004 D. Robots(期望dp) 题意 给一个DAG,保证入度为$0$的点只有$1$,出 ...
- vivado sdx 綜合報錯ERROR: [SdsCompiler 83-5019] Exiting sds++ : Error when calling 'aarch64-linux-gnu-g++ -c
ERROR: [SdsCompiler 83-5019] Exiting sds++ : Error when calling 'aarch64-linux-gnu-g++ -c 主函數 添加 頭文件 ...
- Web前端推荐学习站点
http://javascript.ruanyifeng.com/ JavaScript参考标准教程,写的很不错. https://www.xiaohuochai.cc/ 小火柴前端站 http ...
- Orleans 3.0 为我们带来了什么(转载)
以下为本篇文章的 作者: 艾心 出处: https://www.cnblogs.com/edison0621/ 原文:https://devblogs.microsoft.com/dotnet/orl ...