排序(一)之冒泡排序Bubble Sort

原创 2016年05月31日 19:33:42
一、冒泡排序的算法思想

 

       直接讲思想可能不好理解,咱们先看看下面这个例子吧。

 

          有10个数字的原顺序如下,现要将它从小到大排列,用冒泡排序的思想怎么做呢?

         原序列:1       9       3       0      6       5        8          2         4         7

       在冒泡排序的每一趟中,依次比较相邻的两个元素,如果顺序不对,就交换他们。那么,

       第一趟冒泡排序的结果为: 1       3       0       6      5       8        2       4         7         9

       第二趟冒泡排序的结果为:1       0       3       5      6       2        4       7         8         9

       第三趟冒泡排序的结果为: 0       1       3       5      2       4        6       7         8         9     

        .......

       第九趟冒泡排序的结果为: 0       1       2       3      4       5        6       7         8         9 

       通过上面的例子,我们总结一下:

(1)要将n个元素冒泡排列为有序,需要排n-1趟;

(2)每一趟冒泡排序都通过两两比较 将该趟最大的放在第n-i(i为当前的趟数)的位置上,每趟需要进行n-i-1次两两比较。

二、代码实现:

      通过以上的讲解,我们可以将代码实现出来。代码实现如下:(环境:VS2010 语言:c语言)

#include <stdio.h>
#include <stdlib.h>

void BubbleSort(int* arr, int len)
{
	int i = 0;
	int j = 0;
	for(i = 0; i < len-1; i++)        //需要排len-1趟
	{
		for(j = 0; j < len-i-1; j++)  //每趟进行len-i-1次两两比较
		{
			if(arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}
}

int main()
{
	int i = 0;
	int array[10] = {1,9,3,0,6,5,8,2,4,7};
	BubbleSort(array, 10);
	for(i = 0; i<10; i++)
	{
		printf("%d ",array[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}


这个代码是最初的思想,老老实实一趟一趟排序,有些特殊情况没有得到优化。现在我们来优化一下吧。

 

三、思想优化:

1.优化排序趟数:

   针对基本有序或已经有序的序列,我们完全没必要排这么多趟。就比如说1423,我们只需要一次就可以把它排列有序。

  优化思想:定义一个标志,如果一趟中没有任何交换,说明这个序列已经有序,那么我们就不需要进行后面的交换了。

  代码实现如下:flag1为此优化定义的标志

void BubbleSort(int* arr, int len)
{
	int i = 0;
	int j = 0;
	int flag1 = 0;
   	for(i = 0; i < len-1; i++)        //需要排len-1趟
	{
		flag1 = 0;
		for(j = 0; j < len-i-1; j++)  //每趟进行len-i-1次两两比较
		{
			if(arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
				flag1 = 1;
			}
		}
		if(flag1 == 0)
		{
			return;
		}
	}
}


2.优化每趟排序中两两比较的次数

当后面的已经有序,我们就可以记住最后一次交换的位置,下一次比较的时候就只需要比较这个位置之前的元素。

例如,43256789 一趟排序后变为32456789,我们记住2的位置,以后只比较2及之前的就可以了。

这样就可以减少每趟比较的次数。

 

代码实现如下:flag2为此优化的标志

void BubbleSort(int* arr, int len)
{
	int i = 0;
	int j = 0;
	int flag1 = 0;
	int flag2 = 0;
	int k = len-1;                    //用k来记录每趟排序的比较次数
	for(i = 0; i < len-1; i++)        //需要排len-1趟
	{
		flag1 = 0;
		for(j = 0; j < k; j++)        
		{
			if(arr[j] > arr[j+1])
			{
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
				flag1 = 1;
				flag2 = j;
			}
		}
		k = flag2;
		if(flag1 == 0)
		{
			return;
		}
	}
}


 

好了,冒泡排序的讲解就到这里结束了,谢谢阅读,如有发现错误,欢迎指正哦!!

 

              

 

 

 

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

使用数组和指针的形式实现冒泡排序,并优化。bubble_sort();

 方法一: #define CRT_SECURE_NO_WARNINGS 1 #include #include #include   int main() ...

冒泡排序算法(Bubble Sort) Java实现

冒泡排序的基本思想: 两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 import java.util.Arrays; import java.util.Random; /** ...

冒泡排序练习(Bubble Sort)

一. 目的 1)交换排序就是,调整序列中不符合顺序的元素进行交换,最终序列整体符合目标次序。 2)进行冒牌排序练习。 3)算法证明: 初始:将第二个元素与第一个元素进行调整,使之符合从小到大数...

冒泡排序bubble sort

集合S = {s0, s1, ..., sn} 第一趟排序范围从s0到sn,相邻的两个数比较,如果升序排序则两个数交换位置,大的数排在小的数的后面;降序排序则相反。 集合进行第一趟比较后,最大的数排在...

冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort)

原文:https://www.cnblogs.com/shen-hua/p/5422676.html Java中的经典算法之冒泡排序(Bubble Sort) SiberiaDan...

HDU 5775 Bubble Sort(冒泡排序的位置变换)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Problem Description...

冒泡排序 Bubble Sort

最简单的排序方法是冒泡排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底...

冒泡排序 - Bubble Sort

1. 定义 冒泡排序是一种较简单的排序,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。...

Java实例2 - 冒泡排序 Bubble Sort

 /** * 冒泡排序估计是每本算法书籍都会提到的排序方法。 * 它的基本思路是对长度为N的序列,用N趟来将其排成有序序列。 * 第1趟将最大的元素排在序列尾部,第2趟将第2大的元素排在倒数第二的位置...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序(一)之冒泡排序Bubble Sort
举报原因:
原因补充:

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