冒泡排序法附算法实现

1. 冒泡排序

冒泡排序可以算是最经典的排序算法了,因为实现方法最简单,两层 for 循环, 里层循环中判断相邻两个元素是否逆序,是的话将两个元素交换,外层循环一次,就能将数组中剩下的元素中最小的元素“浮”到最前面,所以称之为冒泡排序。

照例举个简单的实例吧:

初始状态: [24, 19, 26, 39, 36, 7, 31, 29, 38, 23]

内层第一趟: [24, 19, 26, 39, 36, 7, 31, 29, 23 , 38 ] ( 9th

[23]8th [38 )

内层第二趟: [24, 19, 26, 39, 36, 7, 31, 23 , 29 , 38] ( 8th

[23]7th [29] )

内层第三趟: [24, 19, 26, 39, 36, 7, 23 , 31 , 29, 38] ( 7th

[23]6th [31] )

内层第四趟: [24, 19, 26, 39, 36, 7, 23, 31, 29, 38] ( 7 、 23 都位于正确的顺序,无需交换)

内层第五趟: [24, 19, 26, 39, 7 , 36 , 23, 31, 29, 38] ( 5th [7]4th

[36] )

内层第六趟: [24, 19, 26, 7 , 39 , 36, 23, 31, 29, 38] ( 4th [7]3rd

[39] )

内层第七趟: [24, 19, 7 , 26 , 39, 36, 23, 31, 29, 38] ( 3rd [7]2nd

[26] )

内层第八趟: [24, 7 , 19 , 26, 39, 36, 23, 31, 29, 38] ( 2nd [7]1st

[19] )

内层第九趟: [7 , 24 , 19, 26, 39, 36, 23, 31, 29, 38] ( 1st [7]0th

[24] )

…...

其实冒泡排序跟选择排序比较相像,比较次数一样,都为 n * (n + 1) / 2 , 但是冒泡排序在挑选最小值的过程中会进行额外的交换(冒泡排序在排序中只要发现相邻元素的顺序不对就会进行交换,

与之对应的是选择排序,只会在内层循环比较结束之后根据情况决定是否进行交换),所以在我看来,选择排序属于冒泡排序的改进版。

鉴于大家的评分给的比较低,下面给出算法实现

public >void sort(T[] array, boolean ascend) {

int length = array.length ;

int lastExchangedIdx = 0;

for (int i = 0; i

// mark the flag to identity whether exchange happened to false boolean isExchanged = false ;

// last compare and exchange happened before reaching index i int currOrderedIdx = lastExchangedIdx> i ? lastExchangedIdx : i;

for (int j = length - 1; j >currOrderedIdx; j--) {

int compare = array[j - 1].compareTo(array[j]); if (compare != 0 && compare > 0 == ascend) {

exchange (array, j - 1, j);

isExchanged = true ;

lastExchangedIdx = j;

}

}

// if no exchange happen means array is already in order if (isExchanged == false ) {

break ;

}

}

}

2、选择排序实现

改进版的选择排序实现如下:

public >void sort(T[] array, boolean ascend) {

int len = array.length ;

for (int i = 0; i

int selected = i;

for (int j = i + 1; j

int compare = array[j].compareTo(array[selected]); if (compare != 0 && compare

}

}

exchange (array, i, selected);

}

}

1. 冒泡排序

冒泡排序可以算是最经典的排序算法了,因为实现方法最简单,两层 for 循环, 里层循环中判断相邻两个元素是否逆序,是的话将两个元素交换,外层循环一次,就能将数组中剩下的元素中最小的元素“浮”到最前面,所以称之为冒泡排序。

照例举个简单的实例吧:

初始状态: [24, 19, 26, 39, 36, 7, 31, 29, 38, 23]

内层第一趟: [24, 19, 26, 39, 36, 7, 31, 29, 23 , 38 ] ( 9th

[23]8th [38 )

内层第二趟: [24, 19, 26, 39, 36, 7, 31, 23 , 29 , 38] ( 8th

[23]7th [29] )

内层第三趟: [24, 19, 26, 39, 36, 7, 23 , 31 , 29, 38] ( 7th

[23]6th [31] )

内层第四趟: [24, 19, 26, 39, 36, 7, 23, 31, 29, 38] ( 7 、 23 都位于正确的顺序,无需交换)

内层第五趟: [24, 19, 26, 39, 7 , 36 , 23, 31, 29, 38] ( 5th [7]4th

[36] )

内层第六趟: [24, 19, 26, 7 , 39 , 36, 23, 31, 29, 38] ( 4th [7]3rd

[39] )

内层第七趟: [24, 19, 7 , 26 , 39, 36, 23, 31, 29, 38] ( 3rd [7]2nd

[26] )

内层第八趟: [24, 7 , 19 , 26, 39, 36, 23, 31, 29, 38] ( 2nd [7]1st

[19] )

内层第九趟: [7 , 24 , 19, 26, 39, 36, 23, 31, 29, 38] ( 1st [7]0th

[24] )

…...

其实冒泡排序跟选择排序比较相像,比较次数一样,都为 n * (n + 1) / 2 , 但是冒泡排序在挑选最小值的过程中会进行额外的交换(冒泡排序在排序中只要发现相邻元素的顺序不对就会进行交换,

与之对应的是选择排序,只会在内层循环比较结束之后根据情况决定是否进行交换),所以在我看来,选择排序属于冒泡排序的改进版。

鉴于大家的评分给的比较低,下面给出算法实现

public >void sort(T[] array, boolean ascend) {

int length = array.length ;

int lastExchangedIdx = 0;

for (int i = 0; i

// mark the flag to identity whether exchange happened to false boolean isExchanged = false ;

// last compare and exchange happened before reaching index i int currOrderedIdx = lastExchangedIdx> i ? lastExchangedIdx : i;

for (int j = length - 1; j >currOrderedIdx; j--) {

int compare = array[j - 1].compareTo(array[j]); if (compare != 0 && compare > 0 == ascend) {

exchange (array, j - 1, j);

isExchanged = true ;

lastExchangedIdx = j;

}

}

// if no exchange happen means array is already in order if (isExchanged == false ) {

break ;

}

}

}

2、选择排序实现

改进版的选择排序实现如下:

public >void sort(T[] array, boolean ascend) {

int len = array.length ;

for (int i = 0; i

int selected = i;

for (int j = i + 1; j

int compare = array[j].compareTo(array[selected]); if (compare != 0 && compare

}

}

exchange (array, i, selected);

}

}


相关文章

  • C语言程序设计冒泡排序教学案例 杨进
  • C 语言程序设计冒泡排序教学案例 永川职业教育中心 杨进 [案例背景] 排序是计算机学科中一项复杂而重要的技术,在各种软件中使用频率都很高,因此专家们研究了各种排序算法.在中职类设计课程教学中,常以冒泡排序来讲解排序的原理,它简单,但过程繁 ...查看


  • PHP冒泡排序和查找算法介绍
  • 最新PHP冒泡排序和查找算法介绍 以下是三零网为大家整理的最新PHP冒泡排序和查找算法介绍的文章,希望大家能够喜欢! 冒泡排序(bubble sort)的原理是什么? 冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依 ...查看


  • 数据结构课程设计-综合排序
  • 东华理工大学 课程设计报告 课程设计题目: 综合排序的设计 学生姓名:何杨 班 级:1223202 专 业:信息与计算科学 指导教师:郭树蕻 2014年 12 月 13 日 目录 摘要 ........................... ...查看


  • 排序比较次数的数据结构分析
  • 排序 排序问题的输入是一个线性表,该线性表的元素属于一个偏序集:要求对该线性表的元素做某种重排,使得线性表中除表尾外的每个元素都小于等于(或大于等于)它的后继. 设R 为非空集合A 上的二元关系,如果R 满足自反性(对于每一个x ∈A ,( ...查看


  • 数据结构课程设计实验报告心得体会C++
  • 专业班级:姓 名:学 号:设计时间:指导教师: 排序算法比较分析 08软件工程2班 汪伟 08010xxxxx 2010-9-15--2010-9-27 杨薇薇 课程设计报告的内容 一.题目:排序算法比较 1. 设计目的 1. 掌握各种排序 ...查看


  • C语言冒泡.插入法.选择排序算法
  • C 语言中三种常见排序算法分析 一.冒泡法(起泡法) 算法要求:用起泡法对10个整数按升序排序. 算法分析:如果有n 个数,则要进行n-1趟比较.在第1趟比较中要进行n-1次相邻元素的两两比较,在第j 趟比较中要进行n-j 次两两比较.比较 ...查看


  • C程序设计毕业论文
  • 摘 要 <C 程序设计>作为各大院校必修课程之一.因为C 语言是计算机程序语言的入门语言.课程中一些难以理解的程序算法,传统的书本加教师讲授的学习模式往往花费了大量的时间,而学生却难以完全理解和接受.而利用多媒体CAI 课件,通 ...查看


  • 数据结构选择题集锦
  • 单项选择 ( B ) 1. 通常所说的主机是指∶ A) CPU B) CPU和内存 C) CPU.内存与外存 ( C )2. 在计算机内部,一切信息的存取.处理和传送的形式是∶ A) ACSII码 B) BCD码 C) 二进制 D) 十六进 ...查看


  • 进制转换和排序习题
  • 进制转换.逻辑判读.排序专项习题 一.选择题 1.设字符串S="Olympic ",S 的非空子串的数目是( ). A. 29 B. 28 C. 16 D. 17 E. 7 2.将数组{8, 23, 4, 16, 77, ...查看


热门内容