排序算法大荟萃——冒泡排序算法

1、基本思想:将无序数组R[1...n]垂直排列,从下往上扫描数组R,对比相邻的两个元素,如果上面的元素值小于下面的值,则调整这两个相邻元素的位置,然后继续向上扫描,直到排好序为止。

2、排序过程:

(1)初始化:读取无序数组R[1...n]

(2)第一趟扫描:从数组R底部开始向上扫描,依次比较相邻的两个元素,若发现数值较小的在上面,则交换两个元素的位置。即依次比较(R[n]、R[n-1])、(R[n-1]、R[n-2])、。。。、(R[2]、R[1]),对于每对元素(R[j]、R[j+1]),若R[j+1].key < R[j].key,则交换R[j+1]和R[j]的内容。

第一趟扫描完毕,关键字最小的元素在第一个位置R[1]。

(3)第二趟扫描:扫描R[2...n],扫描完毕时,关键字次小的元素在第二个位置R[2]

最后,经过n-1趟扫描可得到有序数组R[1...n]

注:若发现某趟扫描中,没有元素进行位置交换,说明所有元素处于有序状态,该趟扫描结束后可以停止排序。因此,可以引入一个布尔量exchange,每趟扫描前,将exchange置为false,如果排序过程(即扫描过程)发生了元素交换,则将exchange置为true,每趟扫描结束后检查exchange,若exchange为false,则终止算法,不再进行下一趟排序。

3、代码如下:

void BubbleSort(SeqList R)
{
int i,j;
Boolean exchange;
for(int i = 1; i < n; i++)
{
exchange=false;
for(j=n-1;j >= i; j--)
{
if(R[j+1].key < R[j].key)
{
R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
exchange=TRUE;
}
if(!exchange)
return;
}
}
}

冒泡排序是稳定的排序,最坏时间复杂度为O(n^2),最好时间复杂度为O(n),平均时间复杂度为O(n^2),空间复杂度为O(1)。

摘至程序员面试宝典,侵权必删。

时间: 2024-10-03 18:10:41

排序算法大荟萃——冒泡排序算法的相关文章

排序算法大荟萃——快速排序算法

1.快速排序 又称分治算法,分治的基本思想是蒋原问题分解为若干个规模更小但结构与原问题相似的子问题,然后递归地解决这鞋子问题,子问题的结组合为原问题的解. 快速排序是一种不稳定的算法,平均时间复杂度为O(n log n),最差情况是O(n^2),空间复杂度O(log n) (1)基本思想 过程如下:分解->求解->组合. 分解:在无序队列R[1...n]中任选一个元素k为基准记录,并且满足R[1...k].key<=R[k].key<=R[k+1...n].key 求解:递归调用快

算法基础之--冒泡排序算法

一: 使用图解 ,讲解冒泡排序 二:代码基本实现 /** * 对无序的数组进行冒泡排序 */ public static void sort(int[] arr) { //外面的for循环控制的是比较的轮数 //例如:6个元素的数组,要比较5轮 for(int i = arr.length - 1;i > 0;i--){ //里面的for循环控制的是每轮比较的次序 for(int j = 0;j < i;j++){ if(arr[j] > arr[j + 1]){ int temp =

排序算法系列:冒泡排序与双向冒泡排序

概述 排序算法应该算是一个比较热门的话题,在各个技术博客平台上也都有一些博文进行了一定程度的讲解.但还是希望能从自我完善的角度出发,可以更详细.全面.形象地表达这些算法的精髓.本文就先从最简单的冒泡排序开始说起,别说你已经彻底了解了冒泡排序算法(虽然一开始我也是这样以为的). 版权说明 本文链接:http://blog.csdn.net/lemon_tree12138/article/details/50474230 – Coding-Naga - 转载请注明出处 目录 概述 版权说明 目录 冒

数据结构和算法-002 数组排序 冒泡排序

冒泡排序 1算法原理 1. 冒泡排序算法的运作如下:(从后往前) 2. 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 3. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 4. 针对所有的元素重复以上的步骤,除了最后一个. 5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 2算法分析 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数  均达到最小值: ,. 所

排序大荟萃

选择排序 图像化显示: 选择排序的基本思想:从待排序序列中找到最小(大)的元素,存放到序列起始位置,缩小排序范围,再找当前序列最小(大)的元素,放在起始位置之后,直到所有数据都被排完. 时间复杂度=O(n^2) 空间复杂度=O(1) 最好情况:已经有序 交换次数O(1) 最坏情况:逆序 交换次数O(n-1) 下面是c++版本的代码实现 #include <iostream> using namespace std; //初始版本,每次找到最小的 void SelectSort(int *a,s

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 算法实现:(HDU 1040 亲测 AC) #include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); vo