八大排序算法之五--交换排序—冒泡排序(Bubble Sort)
基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
算法实现:(HDU 1040 亲测 AC)
#include<iostream>
using namespace std;
const int N =;
void BubbleSort(int a[],int );
void print(int a[],int num);
void swap(int &a,int &b); int main()
{
int s[N];
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int j=;j<n;j++)
cin>>s[j];
BubbleSort(s,n);
print(s,n);
cout<<endl;
}
return ;
}
void BubbleSort(int a[],int num)//冒泡排序算法
{
for(int i=;i<num-;i++)
{
for(int j=;j<num-i-;j++)
{
if(a[j]>a[j+])
{
swap(a[j],a[j+]);
}
}
}
}
void swap(int &a,int& b)//交换元素
{
int temp;
temp=a;
a=b;
b=temp;
}
void print(int a[],int n)//输出数组元素
{
cout<<a[];
for(int k=;k<n;k++)
{
cout<<" "<<a[k];
}
}
n个数排序 比较趟数为n-1次
算法时间复杂度:O(n2)
空间复杂度 :O(n)
改进版本:
上面的冒泡排序中每一趟排序操作只能找到一个最大值或最小值,但如果在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
void BubbleSort_Modify(int a[],int num)//冒泡排序算法
{
int low=;
int high=num-;
while(low<high)
{
for(int i=low;i<high;i++)// 正向冒泡得到最大值
if(a[i]>a[i+])
swap(a[i],a[i+]);
high--;//high前移一位
for(int i=high;i>low;i--)// 反向冒泡得到最小值
{
if(a[i]<a[i-])
swap(a[i],a[i-]);
}
low++;//low后移一位
}
}
优化二:
若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个标签flag,在每趟排序开始前,先将其置为0。若排序过程中发生了交换,则将其置为1。各趟排序结束时检查flag,若未曾发生过交换则终止算法,不再进行下一趟排序。
void BubbleSort2(int a[],int n)
{
int i=,j=;
for(i=;i<n-;i++)
{
int flag=;
for(j=;j<n-i-;j++)
{ if(a[j]>a[j+])
{
int tmp=a[j];
a[j]=a[j+];
a[j+]=tmp;
flag=;
}
}
//判断标志位是否为0,如果为0,说明后面的元素已经有序,就直接return
if(flag==)
return;
} }
八大排序算法之五--交换排序—冒泡排序(Bubble Sort)的更多相关文章
- 八大排序算法之六--交换排序—快速排序(Quick Sort)
基本思想: 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小.另一部分记录的 元素值比基准值大. 3 ...
- 八大排序算法之七—堆排序(Heap Sort)
堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
- 【排序算法】冒泡排序(Bubble Sort)
0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2) 次交 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
- 八大排序算法C++代码实现
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...
随机推荐
- jQuery中append()与appendTo()方法区别
1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...
- Java基础之泛型——使用泛型链表类型(TryGenericLinkedList)
控制台程序 定义Point类: public class Point { // Create a point from its coordinates public Point(double xVal ...
- java-JDBC-Oracle数据库连接
java-JDBC连接oracle数据库,StateMent和PreparedStatement对比(查询query) 1. PreparedStatement接口继承Statement, Prepa ...
- hduoj 4706 Children's Day 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4706 Children's Day Time Limit: 2000/1000 MS (Java/Others) ...
- 大数据Spark超经典视频链接全集
论坛贴吧等信息发布参考模板 Scala.Spark史上最全面.最详细.最彻底的一整套视频全集(特别是机器学习.Spark Core解密.Spark性能优化.Spark面试宝典.Spark项目案例等). ...
- JavaScript: basis
ref: http://www.imooc.com/code/387 1. html里直接嵌入js: <!DOCTYPE HTML> <html> <head> & ...
- UML:时序图
时序图是用来描述对象的状态(或某数值)随时间变化而变化的图,一般软件开发中很少会用到. 灯有开和关两种状态,随着时间的推移,期间有人去开或者关这个灯,用时序图表示如下: 注意:蓝色和红色圈圈.黄色底色 ...
- 解决HierarchyViewer不能连接真机的问题
今天想通过HierarchyViewer分析一下Android应用的布局,但是发现无法连接上真机,错误如下: 1 2 3 4 5 [hierarchyviewer]Unable to get ...
- JSP和servlet有什么区别?
JSP和servlet有什么区别? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达. JSP编译后是"类servlet". Servlet ...
- yii中sphinx索引配置解析
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/#请先将var/test/documents.sql导入数据库,并配置好 ...