交换排序之冒泡排序

来源:互联网 发布:优雅的谎言影评知乎 编辑:程序博客网 时间:2024/05/01 21:15

冒泡排序算法的基本思想是:假设待排序表长为n,从前往后(或从后往前)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们成它为一趟冒泡,结果将最大(最小)的元素交换到待排序列的最后一个位置。下一趟冒泡时,前一趟确定的最大元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中的最大元素放到了序列的最终位置。
public class BubbleSort {

public static void main(String[] args) {    int[] values = { 120, 109, 98, 87, 76, 65, 54, 43, 32, 21, 10 };    sort(values);}/** * 冒泡排序,交换相邻的两个元素确保较大的元素被移动最后。 *  * @param values */public static void sort(int[] values) {    int temp = 0;    for (int i = 0; i < values.length - 1; i++) {// 趟数n-1趟        for (int j = 0; j < values.length - i - 1; j++) {// 对比交换相邻数据n-i-1次            if (values[j] >= values[j + 1]) {                temp = values[j];                values[j] = values[j + 1];                values[j + 1] = temp;            }        }    }// for}// sort

}
冒泡排序算法性能分析:
1)空间效率:仅使用了常数个辅助单元,因而空间复杂度为O(1)
2)时间效率:当初始序列有序时,第一趟冒泡比较次数为n-1,移动次数为0,此时直接跳出循环,从而最好的情况下的时间复杂度为O(n);当初始序列为逆序时,需要进行n-1趟排序,第i趟排序需要进行n-i次比较,而且每次比较需要移动元素3次来交换元素位置,这种情况下,比较次数为n(n-1)/2,移动次数为3[n(n-1)/2],从而,最坏情况下时间复杂度为O(n²),其平均时间复杂度也为O(n²)。
3)稳定性:由于当i>j且A[i].key=A[j].key时,不会交换两个元素,从而冒泡排序是一个稳定的排序方法。

冒泡排序的应用:
当待排序的元素规模小:用冒泡排序。规模大一般用快速排序,堆排序。冒泡排序从空间复杂度和时间复杂度来看并不是最好的排序方法。但是冒泡排序有一些优点:冒泡排序空间复杂度较低,是一种稳定的排序(冲突间相对位置不变),当文件为正序时冒泡方法最佳。缺点是时间复杂度高,效率不好。

0 0
原创粉丝点击