您的位置:首页 > 其它

排序算法之冒泡排序

2016-04-03 21:44 148 查看

排序算法之冒泡排序

点开JDK的Arrays工具类,有个静态方法sort(),一直用着,也没怎么看过源码,于是心血来潮,点开看看。原来是背后用的是DualPivotQuicksort。

原文:

This class implements the Dual-Pivot Quicksort algorithm by Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.

对于the Dual-Pivot Quicksort algorithm,虽然看过流程图了,但感觉到确实不太懂。于是回顾回顾基本排序算法知识,深感学习排序算法,要理解,可以这样思考:

一趟排序后,发生什么

一共,需要几趟排序

冒泡排序

冒泡排序是简单排序的一种,思想是:

只在相邻元素间比较或交换,一趟排序后,最大元素放到尾部

那么,此时需要外层循环多少次来执行一趟排序呢?从尾部往前遍历

所以:

步骤一:从头开始循环,比较相邻元素,小的放在前

步骤二:外层循环,从最后一个元素开始,往前遍历

步骤三:当不再发生交换时,结束循环。那么设个标记。

public static void bubbleSort(int[] array,int length) {
int i,j,flag;
for(i = length - 1; i >= 0; i--) {
flag = 0;
for(j=0;j<length-1;j++) {
//相邻元素比较
if(array[j + 1] < array[j]) {
//swap(array[j],(array[j+1])
array[j] = array[j] + array[j+1];
array[j+1] = array[j] - array[j+1];
array[j] = array[j] - array[j+1];
flag = 1;//标记交换
}

if(flag == 0 ) {
break;
}
}
}
}

public static void main(String[] args) {
int[] a = { 12, 6, 8, 33, 16, 22, 9, 14, 2, 17 };

bubbleSort(a,a.length);

for(int i : a) {
System.out.print(i + " ");
}
}


上面结果是没问题,不过仔细想想,既然一趟排序后,尾部的元素已经有序,那么它们就不必参与内层循环了,外层循环是从尾部开始的,所以,可以这样修改,提高效率

public static void bubbleSort(int[] array,int length) {
int i,j,flag;
for(i = length - 1; i >= 0; i--) {
flag = 0;
for(j = 0; j < i; j++) {
//相邻元素比较
if(array[j + 1] < array[j]) {
//swap(array[j],(array[j+1])
array[j] = array[j] + array[j+1];
array[j+1] = array[j] - array[j+1];
array[j] = array[j] - array[j+1];
flag = 1;//标记交换
}

if(flag == 0 ) {
break;
}
}
}
}


此外,还可以这样思考,个人认为上面的容易理解。

步骤三:外层要循环多少次?2个元素,1趟,3个元素,2趟。。。

//此种方式,思考外层循环循环多少次,即比较多少趟
for (int j = 0; j < length - 1; j++) {

// 一趟排序,相邻两个元素比较,最大元素放到最后,同时,长度上去掉已经排好的位置
for (int i = 0; i < length - 1 - j; i++) {
if (array[i + 1] < array[i]) {
// 交换,小的在前
array[i] = array[i] + array[i + 1];
array[i + 1] = array[i] - array[i + 1];
array[i] = array[i] - array[i + 1];
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: