浅说数据结构(一):冒泡排序算法

  冒泡排序法可以说是最简单也是最常见的算法之一。

  由于本人水平有限,对算法的理解极其浅薄,就不做长篇大论,直接给出简单的技术总结好了。

  怎样才算是冒泡排序?学这个算法会很容易产生一个困惑:排序后的数据到底是从最小值到最大值,还是从最大值到最小值?

  答案是:从最小值到最大值。到底从最大值到最小值算是什么算法,本人是不清楚的。(或者也算冒泡排序或不存在?知道的大牛请指教。)

  不多说,直接给出算法代码:

for(i = 1;i < n;i++){
     for(j = 0;j<n - i;j++)
          if(arr[j + 1] < arr[j]){
              temp = arr[j];
              arr[j] = arr[j + 1];
              arr[j + 1] =temp;
          }
} 

代码分析:

  这段代码中嵌套了两层for循环语句。其中,第一层是算法计算的趟数(大概可以理解为遍历数组的次数),可以看到要完成整个算法,前后需 要经历n-1趟。需要注意的是,第一层的变量i是不参与遍历数组的,也就是说,不管数组需要怎样比较都与i无关,它的作用仅仅在于记录遍历的趟数,还有作为“倒计时”(即第二层for循环语句中的"j < n- i")。

  第二层是一趟对数组遍历排序中的操作。上面说过,尽管这个算法需要两个变量,但参与比较的仅仅只有j一个变量。我是迷糊了很久才终于注意到了这一点(一直都以为是拿arr[i]和arr[j]比较啊,悲催啊~~)。需要注意的是它的排序过程,根据它的排序结果,是从最小值到最大值,也就是说,整个算法的目的都在于把最大值“冒泡”到数组的最末尾的位置。算法中出现需要对前后数据进行交换的情况只有“前一个数据大于后一个数据”(我们称之为“逆序”)的时候,也就是"arr[j + 1] < arr[j]"的时候。

  第一趟下来就可以把最大值给“冒泡”出来,第二趟就可以“冒泡” 出倒数第二大的值……以此类推,直到不再出现逆序的时候就完成了冒泡排序(一般都是在完成数组最后一个值的排序的时候吧?)。

具体遍历过程如下(只是简略的描述):

暂且说这么多,其他详细的之后再补充。有错漏之处,请各位多多指教。

时间: 2024-11-12 08:57:10

浅说数据结构(一):冒泡排序算法的相关文章

数据结构——排序——冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序.尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的. 冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次

数据结构之--冒泡排序算法及改进

冒泡排序,是我们学习数据结构第一个排序算法,也是一种最常见和简单的排序算法. 排序原理: 我们把一个数组从左到右依次两两元素比较,比较完成一趟后,能确定最大(最小)值,放在最右边(最左边): 剩下的元素重复上述步骤,直到整个数组有序. 该算法时间复杂度一般为n2  . java实现代码如下: public class BubbleSort { public static void swap(int[] array, int a, int b) { array[a] = array[a] ^ ar

冒泡排序算法总结

冒泡排序算法是思路最简单.最直接的排序方法之一. 每遍历一遍,则将最大(或者最小)的一个数冒泡出来. 预先定义的排序类型.由于只是为了验证排序方法是否正确,所以此处只是简单的对10个元素进行排序检测.如下所示: #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; int length; }SqList; void swap(SqList *L,int i,int j) { int temp = L->r[i]; L->r[i] = L-&

复习数据结构:排序算法(二)——冒泡排序

这篇复习冒泡排序.     冒泡排序也是一种稳定排序.内排序. 冒泡排序的基本思想:对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 插入排序比冒泡排序快! 上面说的是普通的冒泡排序算法,时间复杂度是O(n^2),这种方法只能一趟排序操作只能找到一个最大值或最小值,消耗时间太多.     改进方法1:我们可以让每趟排序中进行正向和反向两遍冒泡的方法,一次就可以同时得到

数据结构之------C++指针冒泡排序算法

C++通过指针实现一位数组的冒泡排序算法. 冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 代码: 1 /* 2 Name:冒泡排序算法 3 Copyright:Null 4 Author:小X 5 Date: 06-10-14 10:34 6 Description:C++通过指针实现一维数组的冒泡排序 7 */ 8 9 #include <iostream> 10 11 /* run this program using the console pa

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组.每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变.由于较小的值像"气泡"一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序. 冒泡排序的图解是: 总结一句话就是:连续比较相邻的元素,降序则呼唤.有n个数,共需要比较n-1趟,第i趟,需要比较n-i次. BubbleSort.java public class BubbleSort {//时间复杂度O(n^2) public static void display(i

数据结构(DataStructure)与算法(Algorithm)、STL应用

catalogue 0. 引论 1. 数据结构的概念 2. 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 2.3.1 二叉树 3. 物理结构实例 3.1 链表 3.1.1 单向线性链表 3.1.2 单向循环链表 3.1.3 双向线性链表 3.1.4 双向循环链表 3.1.5 数组链表 3.1.6 链表数组 3.1.7 二维链表 3.2 顺序存储 4. 算法 4.1 查找算法 4.2 排序算法 0. 引论 0x1: 为什么要学习数据结构 N.沃思(Niklaus  Wirth)教授提

数据结构-各类排序算法总结[结局]

各类排序算法总结 五.分配类排序->基数排序: 基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成"多关键码"进行排序的方法.基数排序属于"低位优先"排序法,通过反复进行分配与收集操作完成排序. 对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字, 此时可以采用这种"分配-收集"的办法进行排序,称作基数排序法.其好处是不需要进行关键字间的比较. 例如:对下列这组关键字{278, 109, 063, 930

数据结构-各类排序算法总结[续]

各类排序算法总结 三.交换类排序[接上] 2.快速排序 快速排序是通过比较关键码.交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分.其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码.我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分.对各部分不断划分,直到整个序列按关键码有序. 如果每次划分对一个元素定位后,该元素的左侧子序列与右侧子序列的长度相同,则下一步将是对两个长度减半的子序列进行排序,这是最理想的情况! [算法

数据结构-各类排序算法总结

各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列. 有 n 个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2,-,Kn},相应的下标序列为1,2,-,n.通过排序,要求找出当前下标序列1,2,-, n 的一种排列p1,p2, -,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤-≤Kpn,这样就得到一个按关键字有序的记录序列{R