冒泡排序算法

冒泡排序算法 改进一

冒泡排序算法 改进二

冒泡排序算法 改进三

冒泡排序算法

 基本思想:

  在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的数往上冒。即依次比较相邻的两个数,若发现它们的排序与排序要求相反时,就将它们互。

 实例:

  待排序数组 int a[] = {49,38,65,97,76,13,27,32};

  共 N=8 个数据,需要 N-1=7 趟排序,第 i 趟排序共比较 N-i 次

  每趟排序都会找出一个 待排序数据 中的较大值

  第一趟排序:

    第1次比较调整:49和38比较,49>38,交换位置:  38 49 65 97 76 13 27 32

    第2次比较调整:49和65比较,49<65,不交换位置: 38 49 65 97 76 13 27 32

    第3次比较调整:65和97比较,65<97,不交换位置: 38 49 65 97 76 13 27 32

    第4次比较调整:97和76比较,97>76,交换位置:  38 49 65 76 97 13 27 32

    第5次比较调整:97和13比较,97>13,交换位置:  38 49 65 76 13 97 27 32

    第6次比较调整:97和27比较,97>27,交换位置:  38 49 65 76 13 27 97 32

    第7次比较调整:97和32比较,97>32,交换位置:  38 49 65 76 13 27 32

  第二趟排序:

    第1次比较调整:38和49比较,38<49,不交换位置: 38 49 65 76 13 27 32

    第2次比较调整:49和65比较,49<65,不交换位置: 38 49 65 76 13 27 32

    第3次比较调整:65和76比较,65<76,不交换位置: 38 49 65 76 13 27 32

    第4次比较调整:76和13比较,76>13,交换位置:  38 49 65 13 76 27 32

    第5次比较调整:76和27比较,76>27,交换位置:  38 49 65 13 27 76 32

    第6次比较调整:76和32比较,76>32,交换位置:  38 49 65 13 27 32 76 97

  第三趟排序:

    第1次比较调整:38和49比较,38<49,不交换位置: 38 49 65 13 27 32 76 97

    第2次比较调整:49和65比较,49<65,不交换位置: 38 49 65 13 27 32 76 97

    第3次比较调整:65和13比较,65>13,交换位置:  38 49 13 65 27 32 76 97

    第4次比较调整:65和27比较,65>27,交换位置:  38 49 13 27 65 32 76 97

    第5次比较调整:65和32比较,65>32,交换位置:  38 49 13 27 32 65 76 97

  第四趟排序:

    第1次比较调整:38和49比较,38<49,不交换位置: 38 49 13 27 32 65 76 97

    第2次比较调整:49和13比较,49>13,交换位置:  38 13 49 27 32 65 76 97

    第3次比较调整:49和27比较,49>76,不交换位置: 38 13 27 49 32 65 76 97

    第4次比较调整:49和32比较,49>32,交换位置:  38 13 27 32 49 65 76 97

  第五趟排序:

    第1次比较调整:38和13比较,38>13,交换位置:  13 38 27 32 49 65 76 97

    第2次比较调整:38和27比较,38>27,交换位置:  13 27 38 32 49 65 76 97

    第3次比较调整:38和32比较,38>32,交换位置:  13 27 32 38 49 65 76 97

  第六趟排序:

    第1次比较调整:13和27比较,13<27,不交换位置: 13 27 32 38 49 65 76 97

    第2次比较调整:27和32比较,27<32,不交换位置: 13 27 32 38 49 65 76 97

  第七趟排序:

    第1次比较调整:13和27比较,13<27,不交换位置: 13 27 32 38 49 65 76 97

 Java实现:

  核心代码

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

  完整代码

package sort;
/**
* 冒泡算法 及其 改进算法的实现
* 稳定算法
* @author 那一季的银杏叶
*
*/
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
new BubbleSort().run();
}
public void run(){
int a[] = {49,38,65,97,76,13,27,32};
/**
* 冒泡排序
*/
bubbleSort(a);
}
/**
* 冒泡算法
*/
private void bubbleSort(int a[]){
System.out.println("———————————————————冒泡排序算法—————————————————————");
int n=a.length;
for(int i=0 ; i<n-1; i++) {
for(int j=0; j<n-i-1; j++) {
if(a[j] > a[j+1]){
int temp = a[j] ; a[j] = a[j+1] ; a[j+1] = temp;
}
}
print(a,n,i);
}
printResult(a,n);
}
/**
* 打印排序的最终结果
* @param a
* @param n
*/
private void printResult(int[] a, int n){
System.out.print("最终排序结果:");
     for(int j=0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
/**
* 打印排序的每次循环的结果
* @param a
* @param n
* @param i
*/
private void print(int[] a, int n, int i) {
// TODO Auto-generated method stub
System.out.print("第"+i+"次:");
for(int j=0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
}

 运行结果展示:

冒泡排序算法——改进一

 基本思想:

  加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换。若无数据交换则说明数据已有序,可结束整个排序过程。

 Java实现

/**
* 冒泡排序算法 改进 一
*/
private void bubbleSort1(int a[]){
int n=a.length;
boolean exchange;
for(int i=0 ; i<n-1; i++) {
exchange = false;
for(int j=0; j<n-i-1; j++) {
if(a[j] > a[j+1]){
exchange = true;
int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp;
}
}
/**
* 如果本次循环没进行数据交换,则跳出循环
*/
if(exchange != true) break;
}
}

冒泡排序算法——改进二

 基本思想:

  设置标志性变量pos,用于记录每趟排序中最后一次交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

 Java实现

/**
* 冒泡排序算法 改进二
* @param a
*/
private void bubbleSort2(int a[]){
int n=a.length;
int i = n-1;
while(i>0){
/**
* 每趟开始时,无记录交换
*/
int pos = 0;
for(int j=0; j<i; j++) {
if(a[j] > a[j+1]){
pos = j;
int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp;
}
}
i = pos;
}
}

冒泡排序算法——改进三

 基本思想:

  利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者), 从而使排序趟数几乎减少了一半。

 Java实现

private void bubbleSort3(int a[]){
int n=a.length;
int low = 0;
int high= n -1; //设置变量的初始值
int tmp,j;
while (low < high) {
for(j=low; j<high; j++) //正向冒泡,找到最大者
if (a[j] > a[j+1]) {
tmp = a[j]; a[j]=a[j+1];a[j+1]=tmp;
}
--high;//修改high值, 前移一位 for(j=high; j>low; j--) //反向冒泡,找到最小者
if (a[j]<a[j-1]) {
tmp = a[j]; a[j]=a[j-1];a[j-1]=tmp;
}
++low; //修改low值,后移一位
}
}

(本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~)

排序系列 之 冒泡排序及其改进算法 —— Java实现的更多相关文章

  1. 排序系列 之 简单选择排序及其改进算法 —— Java实现

    简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...

  2. 排序算法入门之冒泡排序及其优化(java实现)

    冒泡排序思想(从小到大): 比较相邻两个元素,如果第一个元素比第二个元素大,就交换他们的位置.第一趟,从第一个元素开始,第一个元素和第二个元素比较,如果第一个元素比第二个元素大,则交换位置:接下来比较 ...

  3. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  4. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

  5. 排序算法(Java实现)

    这几天一直在看严蔚敏老师的那本<数据结构>那本书.之前第一次学懵懵逼逼,当再次看的时候,发觉写的是非常详细,非常的好. 那就把相关的排序算法用我熟悉的Java语言记录下来了.以下排序算法是 ...

  6. 八种排序算法--java实现(转)

    (转:http://blog.csdn.net/without0815/article/details/7697916) 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中, ...

  7. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  8. 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  9. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

随机推荐

  1. winxp精简版没有IIS的解决办法

    首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,系统会自动使用记事本打开sysoc.inf这个文件.在sysoc.inf中找到“[Components]”这一段 ...

  2. 【Linux】ubuntu中怪异的vi编辑器

    由于前几天一场windows系统的比特币勒索病毒,我下狠心装了Linux的ubuntu版本.可是今天在使用命令行中的vi编辑器时出现了怪异的现象:backspace不能删除,编辑模式回车随机出现字母. ...

  3. MSCRM4 在过滤后的LOOKUP框中实现查找

    在MSCRM中让Lookup根据一定的条件实现过滤功能, 这个需求很常见, 在我接触的诸多项目中似乎都需要有这个功能. 但非常遗憾是, MSCRM 的SDK并没有提供实现这个功能的方法. 不过我们应该 ...

  4. 25-Ubuntu-文件和目录命令-其他命令-重定向

    重定向 Linux允许将命令执行结果重定向到一个文件. 将本应显示到终端上的内容输出或追加到指定文件中. 重定向命令 含义 > 表示输出,会覆盖原有文件. >> 表示追加,会将内容追 ...

  5. 【转载】JSTL 标签大全详解

    版权声明:本文为博主原创文章,转载请注明出处,冷血之心的博客. https://blog.csdn.net/qq_25827845/article/details/53311722 (尊重劳动成果,转 ...

  6. 基于MATLAB的多功能语音处理器

    一.设计功能 录制音频,保存音频 对录制的语音信号进行频谱分析,确定该段语音的主要频率范围: 利用采样定理,对该段语音信号进行采样,观察不用采样频率(过采样.欠采样.临界采样)对信号的影响: 实现语音 ...

  7. Google HTML/CSS Style Guide

    转自: http://google.github.io/styleguide/htmlcssguide.xml Google HTML/CSS Style Guide Revision 2.23 Ea ...

  8. jQuery cxSelect 联动下拉菜单

    插件简介 cxSelect 是基于 jQuery 的多级联动菜单插件,适用于省市.商品分类等联动菜单. 列表数据通过 AJAX 获取,也可以自定义,数据内容使用 JSON 格式. 同时兼容 Zepto ...

  9. Codeforces 912A/B

    A. Tricky Alchemy 传送门:http://codeforces.com/contest/912/problem/A 参考程序如下: #include <stdio.h> # ...

  10. EXTJS之DATA PROXY READER

    这是不依赖于STORE的读取.我测试了很久,原来在新版本的EXTJS里.modelmanager.getmodel之类的不用了. 更改为静态的LOAD办法. <!DOCTYPE html> ...