排序算法之冒泡排序

原创 2016年08月29日 15:50:02
冒泡排序是最基础的排序算法,是一种交换排序。
冒泡排序的方法为:对于将被排序的数组 A[1...n],从最左边或者从最右边开始依次比较相邻的两个元素,将大数放在右边,小数放在左边。
  • 从最左边开始即首先比较 A[1] 和 A[2],如果A[1] 比 A[2] 大则交换,保证大数在右边;然后比较 A[2] 和 A[3],如果 A[2] 比 A[3] 大则交换;如此继续,直到比较最后两个数。这样一轮交换过后,最右边的数一定是最大的。接着再对 A[1...n-1] 重复上一轮的交换过程,这样又得到一个最大的数放在最右边(是 A[1...n-1] 的最右边,是整个数组从最右边开始数第二的位置)。重复这样的交换过程,最大值会依次冒泡到右边,最终得到有序数组。
  • 从最右边开始实质是一样的,首先比较 A[n] 和 A[n-1],如果A[n] 比 A[n-1] 小则交换,保证小数在左边;然后比较 A[n-1] 和 A[n-2],如果 A[n-1] 比 A[n-2] 小则交换;如此继续,直到比较最后两个数。这样一轮交换过后,最左边的数一定是最小的。接着再对 A[2...n] 重复上一轮的交换过程,这样又得到一个最小的数放在最左边(是 A[2...n] 的最左边,是整个数组从最左边开始数第二的位置)。重复这样的交换过程,最小值会依次冒泡到左边,最终得到有序数组。

上面所说的两种方法实质是一样的,代码实现上只是数值比较的顺序不一样而已。

下面给出第一种方法的排序代码:

#include <iostream>
using namespace std;

// 数值交换
void swap(int& a, int& b)
{
	int t = a;
	a = b;
	b = t;
}

// 冒泡排序
void BubbleSort(int *arr, int len)
{
	for (int i = 0; i < len - 1; ++i)
	{
		for (int j = 0; j < len - 1 - i; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(arr[j], arr[j + 1]);
			}
		}
	}
}

int main()
{
	int arr[] = { 8, 110, 9, 3, 5, 21, 6, 11, 5, 44, 7, 2, 1, 99, 10 };
	int len = sizeof(arr) / sizeof(*arr);
	cout << "排序前: ";
	for (int i = 0; i < len; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	BubbleSort(arr, len);	// 对数组arr进行冒泡排序
	cout << "排序后: ";
	for (int i = 0; i < len; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}


运行结果如下:



第二种方法将冒泡排序改成如下即可:

void BubbleSort(int *arr, int len)
{
	for (int i = 0; i < len - 1; ++i)
	{
		for (int j = len - 1; j > i; --j)
		{
			if (arr[j] < arr[j - 1])
			{
				swap(arr[j], arr[j - 1]);
			}
		}
	}
}

这样是最基本的排序方案,但存在一个小问题,就是假如在第 i 轮比较交换前数组已经排好序了,但是它还是会进行之后的比较交换,显然这是不必要的。所以对代码进行一点改进,当某一轮比较交换发现已经排好序了就可以结束排序过程了。改进的代码如下:

#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
	int t = a;
	a = b;
	b = t;
}

// 改进的冒泡排序
void BubbleSort(int *arr, int len)
{
	int tail = len - 1;
	int exchange = 1;
	while (exchange)	// 如果没有进行过交换,则已经是排好序的了,无需再进行循环比较
	{
		exchange = 0;
		for (int j = 0; j < tail; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(arr[j], arr[j + 1]);
				exchange = 1;	
			}
		}
		--tail;
	}
}

还有一种改进的冒泡排序,是对要排序的数组进行双向冒泡排序,又称为鸡尾酒排序,代码如下:
#include <iostream>
using namespace std;

void swap(int& a, int& b)
{
	int t = a;
	a = b;
	b = t;
}

// 鸡尾酒排序(双向冒泡排序)
void Cocktail(int *arr, int len)
{
	int head = 0;
	int tail = len - 1;
	int exchange = 1;
	while (exchange)
	{
		exchange = 0;
		// 从左边开始比较,找出最大的元素放到右边
		for (int j = head; j < tail; ++j)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(arr[j], arr[j + 1]);
				exchange = 1;
			}
		}
		--tail;
		
		// 从右边开始比较,找出最小的元素放到左边
		for (int j = tail; j > head; --j)
		{
			if (arr[j] < arr[j - 1])
			{
				swap(arr[j], arr[j - 1]);
				exchange = 1;
			}
		}
		++head;
	}
}

int main()
{
	int arr[] = { 8, 110, 9, 3, 5, 21, 6, 11, 5, 44, 7, 2, 1, 99, 10 };
	int len = sizeof(arr) / sizeof(*arr);
	cout << "排序前: ";
	for (int i = 0; i < len; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	Cocktail(arr, len);	// 鸡尾酒排序
	cout << "排序后: ";
	for (int i = 0; i < len; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}
运行结果也是一样的:


版权声明:本文为博主原创文章,未经博主允许不得转载。

算法代码实现之冒泡排序,Java实现

两种类似的方式: /** * 冒泡排序 * @author roc */ public class BubbleSort { //交换数组元素 private static ...
  • QQ245671051
  • QQ245671051
  • 2016年02月27日 20:45
  • 848

排序算法之冒泡排序的思想以及Java实现

1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它...
  • whq19890827
  • whq19890827
  • 2016年08月14日 21:12
  • 1520

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。 ...
  • tuke_tuke
  • tuke_tuke
  • 2015年12月21日 15:10
  • 2135

冒泡排序算法及其优化

冒泡排序 1、介绍: 冒泡排序和选择排序的思想是蛮力法,冒泡,顾名思义,每次选择后面一个元素(最大或者最小)冒上来,从而得到一个有序的序列。比如对于序列:10、8、5、7、3、1的冒泡第一趟演示图示...
  • diaoaa
  • diaoaa
  • 2014年03月29日 13:20
  • 3209

排序算法之(1)——冒泡排序

**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一...
  • adminabcd
  • adminabcd
  • 2015年06月06日 10:11
  • 869

Java数据结构与算法之常见排序算法总结

目录: 1.概述 2.常用排序方法总结 3.冒泡排序 4.选择排序 5.插入排序 6.归并排序 7.快速排序 8.shell排序 1.概述 学过排序算法的朋友可能都知道排序算法...
  • qq_28057577
  • qq_28057577
  • 2016年10月08日 15:54
  • 602

Java排序算法之冒泡排序和选择排序

前言:纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。——泰戈尔 《飞鸟集》 原文出处: import java.util.Arrays; class Demo { public...
  • u014158743
  • u014158743
  • 2016年09月19日 23:14
  • 685

冒泡排序法--(单个for循环实现)

一.什么叫冒泡排序法? 比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置,然后继续往下找二.两种冒泡排序法步骤: 对下列数组进行排序:(22,3,6,54,86,21,35,1,65,4...
  • Mr_Huan
  • Mr_Huan
  • 2017年01月08日 11:54
  • 2045

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大...
  • guoweimelon
  • guoweimelon
  • 2016年03月16日 10:52
  • 20437

最简单的排序算法之一冒泡排序----js实现

1. 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有...
  • wall1999
  • wall1999
  • 2017年02月15日 11:26
  • 5545
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法之冒泡排序
举报原因:
原因补充:

(最多只允许输入30个字)