您的位置:首页 > 编程语言 > Java开发

冒泡排序 -JAVA详解

2017-10-27 14:25 288 查看
/**
* 冒泡排序是一种比较简单的排序方法,主要原理就是比较相邻元素大小,然后根据结果交换的过程,一次循环后使得最小或者最大的元素在最前面,以此类推,最后使得数组有序,时间复杂度O(n^2)
*
* @author yanhom
* @time 2017/10/27
*/
public class BubbleSort {

/**
* 1.基本的冒泡排序,两个循环,第一次循环拿第一个元素分别跟第二,三.....个元素比较,大于则交换,一次循环完之后最大的元素在最右边
* 2.然后依次拿后一个元素跟后边所有元素比较,大于交换
* 3.循环结束数组变成有序,时间复杂度O(n^2)
*
* @param arr 待排序数组
*/
public static void basciSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for(int j = i+1; j< arr.length; j++) {
if(arr[i] > arr[j]) {
swap(arr, i, j);
}
}
}
}

/**
* 改进版冒泡排序,引入一个变量flag标识内层循环是否是一个空循环(即没有交换元素,没进入if语句内),是则证明后边元素已经是有序的了,直接跳出外层循环
* 注意:内层循环 arr.length - 1 是为了不让数组越界,arr.length - 1 -i 减i得意思是最后i个元素已经有序,排序之前的
*
* 最好情况,如果数组本身是有序的,则只需要n-1次比较就可以完成排序,时间复杂度O(n)
* 最坏情况,如果数组倒序,比较次数为 n-1+n-2+...+1=n(n-1)/2,交换次数和比较次数等值。所以,其时间复杂度依然为O(n2)
*
* @param arr 待排序数组
*/
public static void improveSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
boolean flag = true;
for (int j = 0; j < arr.length - 1 -i; j++) {
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1);
flag = false;
}
}

if(flag) {
break;
}
}
}

/**
* 交换操作
*
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

public static void main(String[] args) {
int[] arr = {3, 1, 0, 4, 5,2,6,6,8,6,7,8,9};
improveSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法