您的位置:首页 > 其它

排序算法之冒泡排序

2012-07-18 15:34 134 查看
时间复杂度:O(n^2)

优点:简单+稳定排序

思路:一共比较n-1趟,第i趟排序从第1个数到第n-i个数。如果第i个数字比第i+1个数字大(或者小),交换这两个数字(升序/降序).

代码:

public void bubbleSort(int[] num) {
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length-1-i; j++) {
if (num[j] > num[j+1]) {
int tmp = num[j];
num[j] = num[j+1];
num[j+1] = tmp;
}
}
}
}


上面是从前往后冒泡方式,也可以从后向前冒泡:

public void bubblesort(int[] num) {
for (int i = 0; i < num.length; i++) {
for (int j = num.length - 1; j > i ; j--) {
if (num[j] < num[j - 1]) {
int temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
  }
 }
}
}


 冒泡排序法存在的不足及改进方法:

  第一,在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序;

  第二,当排序的数据比较多时排序的时间会明显延长。改进方法:快速排序:具体做法:任意选取某一记录(通常取第一个记录),比较其关键字与所有记录的关键字,并将关键字比它小的记录全部放在它的前面,将比它大的记录均存放在它的后面,这样,经过一次排序之后,可将所有记录以该记录所在的分界点分为两部分,然后分别对这两部分进行快速排序,直至排序完

 局部冒泡排序算法对冒泡排序的改进:

  在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年来的一些改进的算法中,只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。局部冒泡排序与冒泡排序算法具有相同的时间复杂度,并且在正序和逆序的情况下,所需的关键字的比较次数和移动次数完全相同。由于局部冒泡排序和冒泡排序的数据移动次数总是相同的,而局部冒泡排序所需关键字的比较次数常少于冒泡排序,这意味着局部冒泡排序很可能在平均比较次数上对冒泡排序有所改进,当比较次数较少的优点不足以抵消其程序复杂度所带来的额外开销,而当数据量较大时,局部冒泡排序的时间性能则明显优于冒泡排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: