代码改变世界

算法-冒泡排序

2011-10-31 21:04  imyang  阅读(233)  评论(0编辑  收藏  举报

冒泡排序的原理:简单的说,就是对数组里面的数字进行两两比较,较大的数不断地被交换上去,就像冒泡一样。每进行一轮排序,就是把最大的数找出来。

下面是实现算法一:

public void BubbleSort(int[] numbers)
		{
			int temp;
			for (int i = 0; i < numbers.Length - 1; i++)
			{
				for (int j = 0; j < numbers.Length - 1; j++) 
				{
					if (numbers[j] > numbers[j + 1]) {
					temp = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = temp;
					}
				}
			}
		}

上面的实现方式是不管哪种情况,都要比较每2个数字,即比较n*n次。即使前面几轮的排序已经把较大的数找出来,后面的排序依然会对这些数进行比较,但实际上并不需要了。
见优化后的算法二:

public void BubbleSort(int[] numbers)
		{
			int temp;
			for (int i = numbers.Length - 2; i > 0; i--)
			{
				for (int j = 0; j < i; j++) 
				{
					if (numbers[j] > numbers[j + 1]) {
					temp = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = temp;
					}
				}
			}
		}

这种实现方式是保持外循环次数不变的情况下,减小内循环的范围,如果已经得到较大的数,则不需要比较。这种情况,需要比较n(n-1)/2次,是不是还可以在优化呢,比如说,数组本来就是排好序的,这时候我们再不停地进行比较就比较多余了。

见优化后的算法三:

public void BubbleSort(int[] numbers)
		{
			int temp;
			bool flag = false;	//判断是否进行过数字的比较
			for (int i = numbers.Length - 2; i > 0; i--)
			{
				//从第二轮比较开始,如果前面没有进行过比较,那么该数组是排好序的,跳出循环
				if (!flag && i < numbers.Length - 2) {
					return;
				}
				for (int j = 0; j < i; j++) 
				{
					if (numbers[j] > numbers[j + 1]) {
					temp = numbers[j];
					numbers[j] = numbers[j + 1];
					numbers[j + 1] = temp;
					flag = true;
					}
				}
			}
		}

改进后的算法,最好的情况下只需要进行一轮的排序,比较n次,最坏的情况也同算法二,比较n(n-1)/2次。

小结:冒泡排序是比较简单的排序算法,容易理解、编程,而且比较稳定,相等数字的相对位置是不会变的。