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

    冒泡排序算法,是最基本的排序算法, 它属于交换排序。

    冒泡排序过程

    设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮"(交换位置),如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

    性能分析

    若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。

    冒泡排序实现

    根据扫描方向不同,实现略有不同。

    代码如下:

    void BubbleSort_1(int a[], int size)
    {
    	for (int i = 0; i < size -1; i++)
    	{
    		for (int j = size - 1; j > i ; j--)
    		{
    			if (a[j-1] > a[j])
    			{
    				int temp = a[j-1];
    				a[j-1] = a[j];
    				a[j] = temp;
    			}
    		}
    	}
    }


    第一步优化

    如果上面代码中,里面一层循环在某次扫描中没有执行交换,则说明此时数组已经全部有序列,无需再扫描了。因此,增加一个标记,每次发生交换,就标记,如果某次循环完没有标记,则说明已经完成排序。

    void BubbleSort_2(int a[], int size)
    {
    	bool bSwaped = true;
    	for (int i = 0; i < size -1; i++)
    	{
    		// 每次先重置为false
    		bSwaped = false;
    		for (int j = size - 1; j > i ; j--)
    		{
    			if (a[j-1] > a[j])
    			{
    				int temp = a[j-1];
    				a[j-1] = a[j];
    				a[j] = temp;
    
    				bSwaped = true;
    			}
    		}
    		// 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
    		if (bSwaped)
    			break;
    	}
    }

    第二步优化

    在第一步优化的基础上发进一步思考:如果R[0..i]已是有序区间,上次的扫描区间是R[i..n],记上次扫描时最后 一次执行交换的位置为lastSwapPos,则lastSwapPos在i与n之间,不难发现R[i..lastSwapPos]区间也是有序的,否则这个区间也会发生交换;所以下次扫描区间就可以由R[i..n] 缩减到[lastSwapPos..n]。

    void BubbleSort_3(int a[], int size)
    {
    	for (int i = 0; i < size - 1 ; i++)
    	{
    		int lastSwapPos = i;
    		for (int j = size - 1; j >lastSwapPos; j--)
    		{
    			if (a[j-1] > a[j])
    			{
    				int temp = a[j-1];
    				a[j-1] = a[j];
    				a[j] = temp;
    
    				lastSwapPos = i;
    			}
    		}
    	}
    }



  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2977905.html
Copyright © 2011-2022 走看看