冒泡排序的原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。(百度文库)
下面是代码的实现:
测试数组:
int[] a = { 6, 4, 3, 7, 9, 15, 1, 85, 67, 43 };
第一种,也是最简单,同时也是最消耗资源的,代码如下
public static int[] sort1Asc(int ap[]) {
int k = 0;
int b = 0;
int ac = 0;
for (int i = 0; i < ap.length; i++) {
k = 0;
for (int j = 0; j < ap.length - 1; j++) {
ac++;
if (ap[j] > ap[j + 1]) {
b++;
k = ap[j];
ap[j] = ap[j + 1];
ap[j + 1] = k;
}
}
}
System.out.println("交换次数为:" + b);
System.out.println("总共循环次数:" + ac);
return ap;
}
执行结果:
交换次数为:12
总共循环次数:90
第二种,减少总共循环次数(数据量大的时候很节约性能)。根据冒泡排序的原理,我们可以知道,当外层循环执行完一次的时候,其中一个值的位置可定时固定了,也就是他已经排序号了,所以在以后的排序中,我们就不需要访问他了,这样就可以减少一半的循环次数,我们知道,主要的排序效果是由内层循环做的,所以目标就是减少二次循环次数,下面是具体代码:
public static int[] sortAsc(int ap[]) {
int k = 0;
int b = 0;
int ac = 0;
for (int i = 0; i < ap.length; i++) {
k = 0;
//重点,控制二次循环的次数,因为最后i为,已经排好序了,所以就不需要再访问了
for (int j = 0; j < ap.length - i - 1; j++) {
ac++;
if (ap[j] > ap[j + 1]) {
b++;
k = ap[j];
ap[j] = ap[j + 1];
ap[j + 1] = k;
}
}
}
System.out.println("交换次数为:" + b);
System.out.println("总共循环次数:" + ac);
return ap;
}
测试结果:
交换次数为:12
总共循环次数:45
正如你看到的,交换次数没有改变,但是总共循环次数减少一半。下面我们继续研究
第三种 减少总共循环次数的基础上,再减少交换次数,我们同新建一个变量,把每次的最小或者最大的位置保存下来,然后等内层循环执行结束,后在进行交换,这种方法主要是指定外层循环的位置为我们的参考值,内层循环的所有比较都是和他进行比较的。当内层循环结束后,如果需要交换,我们才进行交换。下面看代码:
public static int[] sort2Asc(int ap[]) {
int k = 0;
int b = 0;
int ac = 0;
int c = 0;
for (int i = 0; i < ap.length; i++) {
k = i;
for ([color=red]int j =i+1[/color]; j < ap.length ; j++) {
ac++;
if (ap[k] > ap[j]) {
k= j;
}
}
if(k!=i)
{
b++;
c = ap[k];
ap[k] = ap[i];
ap[i] = c;
}
}
System.out.println("交换次数为:" + b);
System.out.println("总共循环次数:" + ac);
return ap;
}
测试结果:
交换次数为:6
总共循环次数:45
正如你想到的,交换次数减少了很多,而且总共循环次数也改变了。
我现在对冒泡算法的学习,就学到这里了,如果那么大牛,有更好的办法,可以讨论共同学习
分享到:
相关推荐
### C++ 数据结构 -- 冒泡排序 #### 知识点概述 本篇文章将深入探讨在C++环境下如何实现冒泡排序算法,并解释为何在某些情况下返回局部变量的地址会导致程序出错。此外,我们还将分析如何正确地利用全局变量或引用...
### 数据结构:交换排序-冒泡排序实验指导 #### 实验背景与目标 在计算机科学领域,数据结构和算法是核心研究对象,其中排序算法作为基础且重要的算法之一,广泛应用于各类数据处理场景。本实验旨在深入理解并掌握...
"数据结构--排序--思维导图" 数据结构中排序是指将一组无序的记录序列按照一定的规则排列成有序的序列,排序的目的是为了提高数据的存储和检索效率。排序算法的稳定性是指在排序过程中,如果待排序表中有两个元素Ri...
MIPS-汇编语言-冒泡排序-含伪代码以及完整注释,可以直接使用
数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 数据结构课程设计冒泡排序 ...
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地组织和排列一系列元素。本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。...
数据结构冒泡排序算法 数据结构冒泡排序算法
在S7-200SMART PLC中实现冒泡排序,需要借助其编程语言——结构化文本(Structured Text,简称ST)。ST语言允许我们编写类似于高级语言的程序,便于处理复杂的逻辑和算法。在PLC程序中,我们需要定义一个数组存储待...
在计算机科学领域,排序算法是数据结构与算法中不可或缺的一部分,它们用于对一组数据进行排列,使其按照特定的顺序呈现。本资源包含三个经典的排序算法的源代码:插入排序、选择排序和冒泡排序,这些都是初级到中级...
这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果...
简单明了的解释了什么是冒泡排序,并且举例详细进行了说明。
数据结构的数据结构课程设计源代码,实现冒泡排序的源代码
### 数据结构排序实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验报告来源于南昌大学科学技术学院信息学科部计算机系的一次专业课程实验。《数据结构》作为一门重要的计算机基础课程,其目的在于...
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便进行各种操作。排序算法则是数据结构中的重要部分,它们用于对一组数据进行有序排列。在这个实验中,我们将关注六种不同的排序算法:选择...
以上是数据结构中关于排序的一些基本知识,包括排序的稳定性、比较次数、内部排序和外部排序的定义,以及直接插入排序、折半插入排序、希尔排序和冒泡排序的原理和特点。这些排序算法各有优缺点,选择哪种排序算法取...
### 数据结构之冒泡排序 #### 一、冒泡排序简介 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行...
(1) 冒泡排序和快速排序; (2) 插入排序和希尔排序; (3) 选择排序和堆排序; (4) 递归和非递归的归并排序。 2. 产生不同规模和分布的数据,以 Excel 生成算法执行时间 T(n)关于输入规模 n 的曲线的形式,...
数据结构中的排序是计算机科学中一个基础且重要的概念,它涉及到如何有效地组织和处理大量数据。在本例中,我们看到几种不同的排序算法被实现,包括直接插入排序、希尔排序、冒泡排序、选择排序以及快速排序。这些...
在这个名为"数据结构与算法冒泡排序小程序"的项目中,我们专注于通过冒泡排序方法对输入的数组进行排序。 冒泡排序的工作原理是通过不断比较相邻元素并交换位置来逐步将最大(或最小)的元素“冒泡”到数组的一端。...