zoukankan      html  css  js  c++  java
  • 算法冒泡排序

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

    下面是实现算法一:

    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次。

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

  • 相关阅读:
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    c语言||作业01
  • 原文地址:https://www.cnblogs.com/zhaohuayang/p/2230735.html
Copyright © 2011-2022 走看看