八大排序算法之五--交换排序—冒泡排序(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++代码实现
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...
随机推荐
- c# yyyyMMdd,dd/MM/yyyy 类型字符串转换为datetime 类型
DateTime ConvertDate = DateTime.ParseExact("20140504", "yyyyMMdd", null, System. ...
- HashedWheelTimer
HashedWheelTimer 是根据 Hashed and Hierarchical Timing Wheels: Data Structuresfor the Efficient Impleme ...
- python入门到精通[一]:搭建开发环境
摘要:Python认识,及在windows和linux上安装环境,测试是否安装成功. 1.写在前面 参加工作也有5年多了,一直在做.net开发,近一年有做NodeJS开发.从一开始的不习惯,到逐步适应 ...
- Leetcode: Combination Sum IV && Summary: The Key to Solve DP
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- poj: 1003
简单题 #include <iostream> #include <stdio.h> #include <string.h> #include <stack& ...
- C++新手之培养良好的编程风格
内功深厚的武林高手出招往往平淡无奇.同理,编程高手也不会用奇门怪招写程序.良好的编程风格是产生高质量程序的前提. 下面以C++为例,来给大家介绍. 一. 命名约定 有不少人编程时用拼音给函数或变量命名 ...
- 。。。Spring框架总结(一)。。。
Spring框架已经学习了两遍了,第一遍基本上忘得差不多了,现在开始复习第二遍的,也复习的差不多了,比之前懂了很多东西,今天就写下来,记录一下我滴小成果! 首先,在Spring框架中有两个重要的概念: ...
- CCF真题之出现次数最多的数
201312-1 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. ...
- 自建目录中jsp页面访问servlet路径出错404
---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ...
- 夺命雷公狗ThinkPHP项目之----企业网站12之文章添加的实现
我们现在就开始写文章添加了,居然是添加当然布列外,我们还是要先讲模版搞定再说被: <!doctype html> <html> <head> <meta ch ...