java 改进冒泡排序面试题_排序系列 之 冒泡排序及其改进算法 —— Java实现

冒泡排序算法

冒泡排序算法 改进一

冒泡排序算法 改进二

冒泡排序算法 改进三

冒泡排序算法

基本思想:

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

实例:

待排序数组 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 6576 13 27 32 97

第二趟排序:

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

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

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

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

第5次比较调整:76和27比较,76>27,交换位置:  38 49 6513 27 76 3297

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

第三趟排序:

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

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

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

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

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

第四趟排序:

第1次比较调整:38和49比较,38<49,不交换位置: 38 49 1327 3265 76 97

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

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

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

第五趟排序:

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

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

第3次比较调整:38和32比较,38>32,交换位置:  13 27 3238 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,不交换位置: 1327 32 38 49 65 76 97

Java实现:

核心代码

private void bubbleSort(inta[]){int n=a.length;for(int i=0 ; i a[j+1]){int temp = a[j] ; a[j] = a[j+1] ; a[j+1] =temp;

}

}

}

}

完整代码

packagesort;/*** 冒泡算法 及其 改进算法的实现

* 稳定算法

*@author那一季的银杏叶

**/

public classBubbleSort {public static voidmain(String[] args) {//TODO Auto-generated method stub

newBubbleSort().run();

}public voidrun(){int a[] = {49,38,65,97,76,13,27,32};/*** 冒泡排序*/bubbleSort(a);

}/*** 冒泡算法*/

private void bubbleSort(inta[]){

System.out.println("———————————————————冒泡排序算法—————————————————————");int n=a.length;for(int i=0 ; i a[j+1]){int temp = a[j] ; a[j] = a[j+1] ; a[j+1] =temp;

}

}

print(a,n,i);

}

printResult(a,n);

}/*** 打印排序的最终结果

*@parama

*@paramn*/

private void printResult(int[] a, intn){

System.out.print("最终排序结果:");for(int j=0;j

System.out.print(" "+a[j]);

}

System.out.println();

}/*** 打印排序的每次循环的结果

*@parama

*@paramn

*@parami*/

private void print(int[] a, int n, inti) {//TODO Auto-generated method stub

System.out.print("第"+i+"次:");for(int j=0;j

System.out.print(" "+a[j]);

}

System.out.println();

}

}

运行结果展示:

6b87fd6528475aec4ac7322ff7ec356c.png

冒泡排序算法——改进一

基本思想:

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

Java实现

/*** 冒泡排序算法 改进 一*/

private void bubbleSort1(inta[]){int n=a.length;booleanexchange;for(int i=0 ; i

exchange= false;for(int j=0; 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实现

/*** 冒泡排序算法 改进二

*@parama*/

private void bubbleSort2(inta[]){int n=a.length;int i = n-1;while(i>0){/*** 每趟开始时,无记录交换*/

int pos = 0;for(int j=0; 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(inta[]){int n=a.length;int low = 0;int high= n -1; //设置变量的初始值

inttmp,j;while (low

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]

tmp= a[j]; a[j]=a[j-1];a[j-1]=tmp;

}++low; //修改low值,后移一位

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值