zoukankan      html  css  js  c++  java
  • 白话经典算法系列之中的一个 冒泡排序的三种实现

     冒泡排序是很easy理解和实现,,以从小到大排序举例:

    设数组长度为N。

    1.比較相邻的前后二个数据,假设前面数据大于后面的数据,就将二个数据交换。

    2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

    3.N=N-1,假设N不为0就反复前面二步,否则排序完毕。

     

    依照定义非常easy写出代码:

    //冒泡排序1
    void BubbleSort1(int a[], int n)
    {
           int i, j;
           for (i = 0; i < n; i++)
                  for (j = 1; j < n - i; j++)
                         if (a[j - 1] > a[j])
                                Swap(a[j - 1], a[j]);
    }
    


    以下对其进行优化,设置一个标志,假设这一趟发生了交换,则为true,否则为false。明显假设有一趟没有发生交换,说明排序已经完毕。

    //冒泡排序2
    void BubbleSort2(int a[], int n)
    {
           int j, k;
           bool flag;
    
           k = n;
           flag = true;
           while (flag)
           {
                  flag = false;
                  for (j = 1; j < k; j++)
                         if (a[j - 1] > a[j])
                         {
                                Swap(a[j - 1], a[j]);
                                flag = true;
                         }
                  k--;
           }
    }
    

    再做进一步的优化。假设有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必然小于10,且这个位置之后的数据必然已经有序了,记录下这位置,第二次仅仅要从数组头部遍历到这个位置就能够了。

    //冒泡排序3
    void BubbleSort3(int a[], int n)
    {
    	int j, k;
    	int flag;
    	
    	flag = n;
    	while (flag > 0)
    	{
    		k = flag;
    		flag = 0;
    		for (j = 1; j < k; j++)
    			if (a[j - 1] > a[j])
    			{
    				Swap(a[j - 1], a[j]);
    				flag = j;
    			}
    	}
    }

    冒泡排序毕竟是一种效率低下的排序方法,在数据规模非常小时,能够採用。数据规模比較大时,最好用其他排序方法。

  • 相关阅读:
    C#中 @ 的用法
    ASP.NET页面间传值
    ASP.NET中常用的文件上传下载方法
    把图片转换为字符
    把图片转换为字符
    JavaScript 时间延迟
    Using WSDLs in UCM 11g like you did in 10g
    The Definitive Guide to Stellent Content Server Development
    解决RedHat AS5 RPM安装包依赖问题
    在64位Windows 7上安装Oracle UCM 10gR3
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4002433.html
Copyright © 2011-2022 走看看