原理介绍

冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现

public static void sort1(int[] arr) {
//比较的轮数
for (int j = 0; j < arr.length - 1; j++) {
//每轮比较的次数
for (int i = 0; i < arr.length - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
}

优化一

当某一轮排序没有移动任何元素证明已经排好序,直接结束排序。如 {1,2,3,4,5,6,7,8,10,9} 第二轮排序后结束排序

代码实现

//当一轮比较中没有移动元素说明已经排好序,提前结束排序
public static void sort2(int[] arr) {
int temp = 0;
boolean flag;//标记是否进行了位置交换
//比较的轮数
for (int j = 0; j < arr.length - 1; j++) {
flag = true;
//每轮比较的次数
for (int i = 0; i < arr.length - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
flag = false;
}
}
if (flag) {
//没有发生位置交换,说明已经排好序
return;
}
}
}

优化二

每轮排序中记下最后一个交换的位置,则此位置后面的元素已经有序,无需再遍历

代码实现

//通过交换的最后一个元素确定已有序的位置,缩短每轮排序的长度
public static void sort3(int[] arr) {
int temp = 0;
int index = arr.length - 1;//当前排序的两个元素中后一个的位置
int temp2 = 0;
boolean flag;//标记是否进行了位置交换
//比较的轮数
for (int j = 0; j < index; j++) {
flag = true;
//每轮比较的次数
for (int i = 0; i < index; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
flag = false;
temp2 = i;
}
}
index = temp2;
if (flag) {
//没有发生位置交换,说明已经排好序
return;
}
}
}

优化三(双向冒泡排序)

每轮中正向扫描找到最大值交换到最后,反向扫描找到最小值交换到最前面。例如: {1,2,3,4,5,6,0}

代码实现

//一轮排序中,从前向后将最大元素移到最后,从后向前将最小元素移到最前
public static void sort4(int[] arr) {
int left = 0;//未排序元素中最小下标
int right = arr.length - 1;//未排序元素中最大下标
int index_left = left;//从后向前排序中发生位置移动的两个元素中后一个元素下标
int index_right = right;//从前向后排序中发生位置移动的两个元素中前一个元素下标
int temp = 0;
boolean flag;//标记是否进行了位置交换
//最小下标与最大下标重合,排序结束
while (left < right) {
flag = true;
//从前向后排出最大
for (int i = left; i < right; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
flag = false;
index_right = i;
}
}
right = index_right;
//从后向前排出最小
for (int i = right; i > left; i--) {
if (arr[i] < arr[i - 1]) {
temp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = temp;
flag = false;
index_left = i;
}
}
left = index_left;
if (flag) {
//没有发生位置交换,说明已经排好序
return;
}
}
}

冒泡排序(Bubble Sort)及优化的更多相关文章

  1. 冒泡排序(Bubble Sort),比较次数优化改进

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  3. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  4. 排序算法--冒泡排序(Bubble Sort)_C#程序实现

    排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...

  5. 【排序算法】冒泡排序(Bubble Sort)

    0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2)  次交 ...

  6. 冒泡排序(Bubble Sort)

    常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...

  7. [算法] 冒泡排序 Bubble Sort

    冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  8. 冒泡排序——Bubble Sort

    基本思想:两个数比较大小,较大的数下沉,较小的数冒起来. 过程: 1.比较相邻的两个数据,如果第二个数小,就交换位置. 2.从后向前两两比较,一直到比较最前两个数据.最终最小数被交换到起始的位置,这样 ...

  9. 算法之经典排序-冒泡排序(bubble sort)

    冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...

  10. C语言讲义——冒泡排序(bubble sort)

    冒泡排序三步走: 循环 交换 回一手 一个数和其它数比较(循环) 每个数都要做这种比较(再一层循环) 准备工作 #include <stdio.h> void sort(int arr[] ...

随机推荐

  1. 如何处理CloudFoundry应用部署时遇到的254错误

    使用SAP云平台的CloudFoundry部署应用: 在cockpit遇到错误信息:instance: a0abe2b5-7623-4cf1-4c65-0c79, index: 0, exit_des ...

  2. NSAutoreleasePool & thread

    https://developer.apple.com/documentation/foundation/nsautoreleasepool An object that supports Cocoa ...

  3. 【BZOJ4300】绝世好题(位运算水题)

    点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...

  4. web跨域及cookie相关知识总结

    原文:web跨域及cookie相关知识总结   之前对于跨域相关的知识一致都很零碎,正好现在的代码中用到了跨域相关的,现在来对这些知识做一个汇总整理,方便自己查看,说不定也可能对你有所帮助. 本篇主要 ...

  5. Quartz 配置文件属性

    主要配置 Property Name Req'd Type Default Value org.quartz.scheduler.instanceName no string 'QuartzSched ...

  6. Linux命令的常用

    使用chown命令更改文件拥有者 在 shell 中,可以使用chown命令来改变文件所有者.chown命令是change owner(改变拥有者)的缩写.需要要注意的是,用户必须是已经存在系统中的, ...

  7. WPF中批量进行验证操作

    //ref,out private void CheckTextboxNotEmpty(ref bool isOK, params TextBox[] textboxes) { foreach (Te ...

  8. ElasticSearch High Level REST API【5】使用模板搜索

    ElasticSearch Rest高级API 提供了多种搜索方式,除了前面讲到的search查询,ElasticSearch 还提供了通过模板搜索查询.我个人比较喜欢这种方式. 我们可以通过脚本预选 ...

  9. redis redis-cli 操作指令

    默认选择 db库是 0 redis-cli -p 6379   查看当前所在“db库”所有的缓存key redis 127.0.0.1:6379> keys *   选择 db库 redis 1 ...

  10. c#:无限极树形结构

    最近一直在研究树形结构菜单,无意中让我弄了出来.先上代码: 首先需要这个的一个类 public class Tree { public int id { get; set; } public stri ...