关闭

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

标签: 冒泡排序
224人阅读 评论(0) 收藏 举报
分类:
一、冒泡排序的算法思想

 

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

 

          有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;
		}
	}
}


 

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

 

              

 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30665次
    • 积分:628
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    博客专栏
    文章分类
    最新评论