假设对数组arr=[9,1,5,8,3,7,4,6,2]由小到大排序
方式一:
从左到右遍历,把每个位置确定下来。
for(i=0;i<len-1;i++){
for(j=i+1;j<len-1;j++){
if(arr[j]>arr[i]){
swap
执行顺序:
1,9,5,8,3,7,4,6,2//只换一次,就确定第1个位置的数据
1,5,9,8,3,7,4,6,2
1,3,9,8,5,7,4,6,2
1,2,9,8,5,7,4,6,3//交换了三次,但是把3居然交换到最后了,这会导致下一次的循环交换次数增加。所以出现更优化的方式二
……
方式二:
仍然是从左到右遍历,确定每个位置的数值。但是内部的循环方式不一样。
for(i=0;i<len-1;i++){
for(j=len-1;j>=i;j--){//从尾部开始循环
if(arr[j]>arr[j+1]){//把小的往前排,就像冒泡一样
swap
9,1,5,8,3,7,4,2,6
9,1,5,8,3,7,2,4,6
9,1,5,8,3,2,7,4,6
9,1,5,8,2,3,7,4,6
9,1,5,2,8,3,7,4,6
9,1,2,5,8,3,7,4,6
1,9,2,5,8,3,7,4,6
继续第二遍循环
1,9,2,5,8,3,4,7,6
1,9,2,5,3,8,4,7,6
1,9,2,3,5,8,4,7,6
1,2,9,3,5,8,4,7,6
……
可以看出,优化主要集中在减少swap次数。方式一会把一个很小的数扔到最后,导致后续的无效swap次数增多。方式二在循环的过程中,一直把小的数字往前调整,直到调整不动为止。可以看出,swap都是有效的。即使前期swap增多,后期swap也会大大减少。
方式二的进一步优化:
假如数组排序前就是2,1,3,4,5,6,7,8,9呢,这样第一次交换后,就已经排好序,后面的比较都浪费了。怎么才能让程序知道已经排好序了呢,答案就是冒泡时发现一个泡都冒不动了。
boolean flag = true;
for(i=0;(i<len-1)&&flag;i++){//
flag = false;
for(j=len-1;j>=i;j--){//从尾部开始循环
if(arr[j]>arr[j+1]){//把小的往前排,就像冒泡一样
flag = true;
swap
可以看出,假如没有swap,flag就会变成false导致循环立即退出。
相关推荐
在这个"冒泡算法.vi"程序中,我们可以预期它将展示如何在LabVIEW中使用冒泡排序来找到一个数组中的最大值。首先,我们需要理解冒泡排序的基本步骤: 1. **初始化**:设置一个未排序的数组,通常以数值型簇的形式...
### 冒泡排序算法在C++中的实现 #### 概述 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要...
冒泡排序是一种简单的排序算法,它的基本思想是通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这...
总的来说,快速排序和冒泡排序都是排序算法的重要实例,它们代表了不同的时间复杂度级别和设计思路。在C#编程中,理解并掌握这两种算法有助于我们更好地理解和优化程序性能,尤其是在处理大量数据时。同时,这也为...
冒泡排序是一种基础的排序算法,它通过重复遍历待排序的序列,比较相邻元素并交换位置,使得每个元素都能逐步“浮”到正确的位置上。在C语言中,实现冒泡排序通常涉及一系列的for循环和if条件语句。然而,原始的冒泡...
冒泡排序是计算机科学中一种简单直观的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成。这...
### 对冒泡算法的改进 #### 背景与意义 冒泡排序是一种简单的排序算法,在数据处理领域有着广泛的应用。其基本原理是通过不断交换相邻元素的位置来达到排序的目的。传统的冒泡排序方法需要对整个序列进行多次遍历...
尽管第二种算法的具体实现代码可能有所不同,但基本思路保持一致。可能的变化在于循环结构的实现方式或者条件判断的细节,不过最终目的仍然是实现从小到大的排序。这种变化可能是为了优化代码的效率或者提高可读性,...
JAVA 演示冒泡算法 内有动画演示 问题 有一数组a,长度为n,把数组中的元素从小到大重新排列 思路 从0到n-1,两两比较数组中的元素,如果前者大于后者,则交换之(如a[0]>a[1],则交换a[0]和a[1])。作一...
4. **链表冒泡排序**:链表冒泡排序的思路类似数组,只是交换操作更为复杂。需要遍历链表,比较相邻节点,并在必要时交换它们的顺序。同时,同样可以通过检查某轮是否进行了节点交换来优化排序过程。 5. **时间...
冒泡排序是一种基础且简单的排序算法,其主要思想是通过重复遍历待排序的数列,一次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经...
5. **文档与源码**:项目内附的文档可能包括设计思路、算法解释、代码实现细节等内容,有助于学习者理解项目的实现过程。源码则提供了实际操作的实例,可以运行和调试,进一步加深对排序算法的理解。 6. **PPT演示*...
初学者可以通过学习冒泡排序来掌握排序算法的基本思路,为进一步学习更复杂的算法打下基础。 综上所述,冒泡排序是一种基础的排序算法,它通过重复遍历数组并交换逆序相邻元素来实现排序。尽管效率较低,但其简单...
然而,冒泡排序的原理和优化思路对于理解其他复杂算法有着重要的铺垫作用。 在深入研究这些代码时,可以关注以下几点: - 算法的实现细节,如循环结构、条件判断和元素交换。 - 如何通过添加标志位来提高效率。 - ...
基于这样的背景,本文将介绍如何使用Win32汇编语言实现冒泡排序算法。虽然汇编语言的学习曲线较为陡峭,但通过实践可以加深对计算机底层工作原理的理解,并有助于提高程序的执行效率。 #### 二、使用开发环境 - **...
首先,冒泡排序的基本思路是:遍历数组,比较相邻两个元素,如果前一个元素大于后一个,就交换它们的位置。这个过程会重复进行,直到数组完全排序。Rust代码实现可能如下: ```rust fn bubble_sort(arr: &mut [i32]...
冒泡排序是计算机科学中一种基础的排序算法,主要用于在一组数中进行排序操作。该算法基于一个简单直观的概念:通过重复遍历要排序的数列,每次比较两个相邻元素,如果顺序错误就交换它们的位置。由于每次遍历都可以...
本文将详细介绍冒泡排序的算法思路、实现代码和优缺分析。 冒泡排序算法思路: 冒泡排序的基本思路是:通过相邻元素之间的比较和交换,使较小的元素逐渐从底部移向顶部,即从下标较大的单元移向下标较小的单元,就...
希尔排序,冒泡排序、快速排序递归排序,快速排序非递归排序,快速排序改进算法
尽管如此,这段代码依然清晰地展示了冒泡排序的基本思路及其在链表上的应用方式。 #### 七、总结 冒泡排序因其简单的实现方式和稳定性,在教学和实践中都有广泛的应用。虽然它的时间复杂度较高,但在处理小规模...