`
diaoaa
  • 浏览: 18851 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

冒泡排序算法及其优化

 
阅读更多

冒泡排序

1、介绍:

冒泡排序和选择排序的思想是蛮力法,冒泡,顾名思义,每次选择后面一个元素(最大或者最小)冒上来,从而得到一个有序的序列。比如对于序列:10、8、5、7、3、1的冒泡第一趟演示图示如图所示

可见第一趟过后做大元素10已经沉底,第二趟就对另外的8、5、7、3、1进行上述同样的比较冒泡,会使得最大元素8沉底,...... ,最终可得到一个有序序列。

2、C语言实现

#include <stdio.h>

void bubbleSort(); //声明函数

int arr[10] = {10,6,4,9,7,26,3,1,11,2};

#define n 10  //宏定义需要排序的序列元素个数

int main()
{
    bubbleSort();  //调用函数
    return 0;
}
//以下是冒泡排序算法
void bubbleSort()
{
    int count = 0; //记录进行比较的次数,考量算法的复杂度
    int i,j,k;
    for(i=0;i<n;i++)  //第一层循环控制循环的趟数
    {
        for(j=0;j<n-1-i;j++) //第二层循环在每趟中进行“冒泡”比较
        {
            count++;   //count+1
            if(arr[j]>arr[j+1]) //加入前一个比后一个大,则交换两个数的位置
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }

    for(k=0;k<n;k++) //打印排序后的序列
    {
        printf("%4d",arr[k]);
    }

    printf("\nTotal count is %d",count); //打印总共比较的次数

}
程序的运行结果:


2-2、Java代码实现

	/**
	 * 冒泡排序
	 *@author DR
	 * @param args
	 * @return
	 *2014年3月
	 */
	public int[] bubbleSort(int...args){ //这里使用JDK提供的可变参数作可变数组
		for(int i=0;i<args.length-1;i++){  
			for(int j=args.length-1;j>i;j--){  //这里从右向左扫描
				if(args[j]<args[j-1]){
					int temp = args[j];
					args[j] = args[j-1];
					args[j-1] = temp;
				}
			}
		}
		return args;
	}
注:程序中有两个for循环,在args[i]左边的元素是已经沉底的,排序好了的元素;j作为一个扫描指针,从右向左扫描,如果j-1位置的大于j位置的元素,则交换它们,直到把最小的那个元素沉底到i+1位置

3、冒泡排序算法的优化

对于上面的序列我们发现,含有10个元素的序列需要45次比较(第一趟9次,第二趟8次,第三趟7次,....... ,第九趟1次),那么真的需要45次吗?对于下面的这种序列{1,2,4,5,8,9,10,14,15,13},使用上面的算法也是45次,但观察发现该序列大部分是有序的,第一趟将15沉底放置最后,得到{1,2,4,5,8,9,10,14,13,15},第二趟将14沉底放置最后,得到{1,2,4,5,8,9,10,13,14,15},从第三趟到最后一趟都无需再移动,所以那些比较都是徒劳的,因此,我们对上述算法进行如下优化,减少算法的比较次数。优化的方法就是加一个标志位,记录本趟比较是否发生交换,下一趟根据这个标志位,若上一次没有交换,则本趟比较无需进行。

4、冒泡排序算法优化C语言实现

#include <stdio.h>

void bubbleSort();

int arr[] = {1,2,4,5,8,9,10,14,15,13};
int i,j,k;

int main()
{
    bubbleSort();
    return 0;
}

void bubbleSort()
{
    int flag = 1;  //添加控制标志位,记录上一趟是否发生交换
    int count = 0;
    for(i=0;i<10&&flag;i++) //指针i控制次数
    {
        for(j=0;j<10-1-i;j++) //j从头开始,将最大的元素沉底到最后
        {
            flag = 0;
            count++;
            if(arr[j]>arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = 1;
            }
        }
    }

    for(k=0;k<10;k++)
    {
        printf("%4d",arr[k]);
    }

    printf("\ntotal count is %d",count);
}
程序运行结果:只需比较24次(第一趟9次,第二趟8次,第三趟7次)


4-2、冒泡排序算法优化Java代码实现

	/**
	 * 冒泡排序的优化算法
	 *@author DR
	 * @param args
	 * @return
	 *2014年3月
	 */
	public int[] bubbleSort2(int...args){
		boolean flag = true;   //是否交换标志位
		for(int i=0;i<args.length-1&&flag;i++){
			flag = false;
			for(int j=args.length-1;j>i;j--){
				if(args[j]<args[j-1]){
					int temp = args[j];
					args[j] = args[j-1];
					args[j-1] = temp;
					flag = true;   //发生交换则让标志位为真
				}
			}
		}
		return args;
	}

5、总结

总的来说,冒泡排序是最基本简单排序的一种,是一种基于蛮力思想的排序,其时间复杂度为o(n²)。


分享到:
评论

相关推荐

    C语言实现冒泡排序算法及其优化

    内容概要:本文介绍了经典的冒泡排序算法的基本概念与执行机制,同时提供了具体的C语言实现方式,并针对算法进行了效率上的优化处理。主要内容涉及冒泡排序算法的详细步骤介绍、C语言编程实现细节以及优化技巧的讲解...

    C语言实现高效的冒泡排序算法及其优化技巧

    内容概要:本文详细介绍了一个高效版本的冒泡排序算法的C语言实现。文中提供了完整的源代码示例,其中包括主函数、数组打印函数和冒泡排序函数。冒泡排序通过重复遍历数组并将较大值“冒”到最后来排序数组,但本文...

    冒泡排序优化算法

    ### 冒泡排序优化算法 ...通过引入布尔变量`flag`,优化后的冒泡排序算法能够有效减少不必要的比较次数,提高排序效率。这种优化策略特别适用于接近有序的数据集,在实际应用中具有一定的实用价值。

    学习排序算法之冒泡排序及其优化笔记.pdf

    冒泡排序算法是一种简单的排序算法,基本思想是通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的大小,若发现逆序则交换,使较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。...

    冒泡排序算法及其JavaScript实现详解.pdf

    本资源详细介绍了JavaScript中的冒泡排序算法,包括其基本原理、具体步骤和优化方法。通过一个具体的代码示例,展示了如何使用JavaScript实现冒泡排序,并解释了代码的关键部分。此外,还讨论了冒泡排序的时间复杂度...

    这是一个冒泡排序算法的C语言改进算法源码,改进法采用双向移动法.zip

    总的来说,这个压缩包提供的源码是学习和理解冒泡排序算法及其优化的好资源,对于初学者和经验丰富的程序员来说,都是一个有价值的参考。通过分析和实践,我们可以更好地掌握C语言编程技巧以及如何优化基础算法。

    深入剖析计算机科学中冒泡排序算法及其性能分析与应用场景

    冒泡排序是一种简单直观的排序算法,尽管效率不高,但由于其实现简单,仍然是学习排序算法的入门首选。文中通过具体的 Python 实现示例展示了冒泡排序的具体操作流程,并对其时间和空间复杂度进行了分析。此外,文章...

    基于Python的冒泡排序算法详解与优化

    内容概要:本文详细介绍了冒泡排序算法的基本概念及其Python代码实现,重点解释了算法的基本步骤,以及常见的优化手段,如设置标志位和鸡尾酒排序。冒泡排序的时间复杂度为O(n²),适用于小规模的数据排序。 适用...

    Go语言冒泡排序算法实现及优化

    内容概要:本文详细介绍了冒泡排序算法的原理,重点讨论了使用Go语言实现该算法的方法,包括数组和切片的选择、双层循环的使用以及条件语句的优化。通过对不同规模数据的性能测试,探讨了冒泡排序在小规模数据和链表...

    一种双向冒泡排序算法的C语言实现及其效率分析.pdf

    基于文件标题和描述的介绍,以下是关于双向冒泡排序算法的C语言实现及其效率分析的知识点。 ### 知识点:双向冒泡排序算法 1. **排序算法分类**:排序算法可按照处理方式不同分为插入类排序、交换类排序和选择类...

    JAVA冒泡排序及其优化

    冒泡排序是一种基础且历史悠久的排序算法,它通过重复遍历待排序的序列,比较相邻元素并根据需要交换它们的位置,使得每一趟遍历后,最大的元素“浮”到序列的末尾,就像水底下的气泡逐渐上升到水面一样。...

    冒泡排序算法详解及优化实现方法

    冒泡排序是一种基础且简单的排序算法,其主要通过相邻元素的比较和交换,将未排序部分中的最大或最小值“冒泡”到...文章还总结了冒泡排序的优缺点及其适用场景,帮助初学者理解这类基础排序算法的思想和实际应用价值。

    Rust语言中冒泡排序算法的高效实现与优化

    内容概要:本文详细介绍了用 Rust 语言实现冒泡排序算法的具体步骤,以及通过设置标志位来优化算法性能的方法。示例代码包括了函数定义、内外层循环逻辑、标志位的应用,并在主函数中展示了如何调用 bubble_sort ...

    冒泡排序算法,有传统算法也有双向冒泡

    ### 冒泡排序算法及其改进:双向冒泡 #### 一、冒泡排序的基本思想 冒泡排序是一种直观且简单的排序算法,它的工作原理类似于自然界中的气泡上升现象。在这个过程中,较小的值逐渐上浮至序列顶端,而较大的值则...

    算法可视化系列——排序算法——冒泡排序

    冒泡排序是一种基础且经典的排序算法,其工作原理是通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。...这些都将是理解冒泡排序算法及其Java实现的重要知识点。

    易语言源码冒泡改进算法易语言源码.rar

    源码中的代码可以作为学习和理解冒泡排序算法及其优化的实例,通过阅读和分析这些源码,可以加深对排序算法的理解,同时也能提升易语言编程技能。 总的来说,这个压缩包中的资源对于学习易语言编程以及了解排序算法...

    计算机科学中冒泡排序算法原理及其在PLC编程中的应用实例解析

    内容概要:文章详细介绍了冒泡排序的基本概念、算法原理及其优化方法。冒泡排序是一种计算机领域中较为直观和简单的排序算法,它的核心机制在于不断比较相邻的元素,并按指定顺序交换位置较大的元素使其逐步向列表...

    冒泡排序算法.zip

    - 这是最原始的冒泡排序算法,它通过不断地比较相邻元素并交换位置来完成排序。 - 每一轮遍历,最大的元素会被移动到正确的位置,即序列的末尾。 - 时间复杂度为O(n^2),其中n是序列的长度。 - 空间复杂度为O(1)...

    冒泡排序算法详解与Python实现

    内容概要:本文详细解析了冒泡排序的基本原理、实现步骤、性能分析及其优缺点,并提供了Python实现。冒泡排序是一种简单直观的排序算法,适用于小规模数据的排序任务,特别适合教学和演示。 适合人群:初学者,特别...

Global site tag (gtag.js) - Google Analytics