排序算法-关于冒泡排序法的疑惑

问题描述

关于冒泡排序法的疑惑

冒泡排序法的代码

        int n=0;
        int temp = 0;
        for (int i = a.length - 1; i > 0; --i) {
            for (int j = 0; j < i; ++j) {
                if (a[j + 1] < a[j]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    n++;
                }
            }
        }

由于我是菜鸟,我写的是这样的

        int n = 0;
        int temp = 0;
        for (int i = a.length - 1; i > 0; i--) {
            for (int j = i - 1; j >= 0; j--) {
                if (a[i] < a[j]) {
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                    n++;
                }
            }
        }

可是我打印出n的值发现冒泡的n值比我写的那个要大,
比如{2,6,4,7,0,1,3,4,5,8,9,0}
冒泡n==26
下面那个n==21。
很疑惑,为什么要前后两个两个比较,相比下面那种有什么优势

解决方案

你写的这种应该叫做选择排序,每次遍历选出最大的那个放到最后面,跟冒泡排序有一定的区别,
选择排序交换次数比冒泡排序较少,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
原地操作几乎是选择排序的唯一优点,当方度(space complexity)要求较高时,可以考虑选择排序;实际适用的场合非常罕见。

解决方案二:

i--是先使用i,再进行减。而--i是先减再使用i

解决方案三:

你用的不是冒泡排序, 你的是简单选择排序, 有没有看到上面冒泡排序判断交换层只关于 j 在比较,这样冒泡每走一趟序列都将更加有序。

任何一本《数据结构》书上都有的, 想详细了解的话可以看看。

解决方案四:

二楼正解。是的,看算法先了解其思想基础,然后才是代码实现的。祝好!

解决方案五:

算法思想:冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。
算法总结及实现
对于具有N个元素的数组R[n],进行最多N-1轮比较;
第一轮,逐个比较(R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-1], R[N]) ; 最大的元素会被移动到R[N]上。
第二轮,逐个比较(R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-2], R[N-1]);第二大元素会被移动到R[N-1]上。
代码是算法思想的体现,你怎么设计算法的,代码就能体现出来。

解决方案六:

所谓冒泡就是一楼说的,前后比较,大的就一个就继续 向后比较,就像冒泡一样,执行一遍循环后大的总是会冒出来的。你需要了解一下冒泡的算法了。

解决方案七:

其实,你写的和原本的那个是没有区别的。至于输出的n值是由条件成立之后交换次数决定的。也就是说如果你给的初始数组不同,也有可能你写的方法输出的n值更大

时间: 2024-09-23 08:35:16

排序算法-关于冒泡排序法的疑惑的相关文章

C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序

插入|排序|算法 本文介绍了C#的四种排序算法:冒泡排序.选择排序.插入排序和希尔排序 冒泡排序 using System: namespace BubbleSorter { public class BubbleSorter { public void Sort(int [] list) { int i,j,temp: bool done=false: j=1: while((j<list.Length)&&(!done)) { done=true: for(i=0:i<li

经典排序算法之冒泡排序(Bubble sort)代码_C#教程

经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第一次两两比较6 > 2交换(内循环) 交换前状态| 6 | 2 | 4 | 1 | 5 | 9 | 交换后状态| 2 | 6 | 4 | 1

Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)_java

一.插入排序算法实现java版本 public static int[] insert_sort(int[] a) { for (int i = 0; i < a.length; i++) { for(int j=i+1;j>0&&j<a.length;j--) { if(a[j]<a[j-1]) { int tmp = a[j]; //这样定义初始化逻辑上是可以的,j变量,每次tmp的值变化的 a[j] = a[j-1]; a[j-1] = tmp; } } }

内部排序算法:冒泡排序

基本思想 将被排序的记录数组R[0..n-1]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其 向上"飘浮".如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止. 具体过程,如下所示: 初始状态:R[0..n-1]为无序区. 第一趟扫描:从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下.重者 在上,则交换二者的位置,即依次比较(R[n-1], R[n-2]).(R

常见的排序算法三——冒泡排序

1.冒泡排序 原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序. 要点:设计交换判断条件,提前结束以排好序的序列循环. 实现: Void BubbleSort(Node L[]) { Int i ,j; Bool ischanged;//设计跳出条件 For(j=n;j<0;j--) { ischanged =false; For(i=0;i<j;i++) { If(L[i]>L[i+1])//如果发现较重元素就向后移动 { Int temp=L[i]; L[i]=

我的Java开发学习之旅------&amp;gt;Java经典排序算法之冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 一.算法原理 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.

排序算法之冒泡排序

冒泡排序 今天学习一下冒泡排序,它是最简单的一种排序算法.这里我们按照降序排列 原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较. 首先,里面用到的swap函数定义如下: //交换位置 void swap(int a[],int i,int j) { int temp =

Java排序算法总结之冒泡排序_java

本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    来看冒泡排序在Java中的算法实现. 冒泡排序是计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序.快速排序的O(nlogn,底数为2),但是有两个优点: 1."编程复杂度"很低,很容易写出代码: 2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后

八大排序算法

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 本文将依次介绍上述八大排序算法. 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤 1)将第一待排序序列第一个