BubbleSort
package com.zyn.sort;
/**
* 原理: 比较两个相邻的元素,将值大的元素交换至右端。
思路: 依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1;
*
* 举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1
第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1
第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1
第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1
第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9
第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9
---------------------------------------------------------------------
第二趟排序:
第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9
第二次排序:6和2比较,6大于2,交换位置: 3 2 6 8 1 9
第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9
第四次排序:8和1比较,8大于1,交换位置: 3 2 6 1 8 9
第二趟总共进行了4次比较, 排序结果: 3 2 6 1 8 9
---------------------------------------------------------------------
第三趟排序:
第一次排序:3和2比较,3大于2,交换位置: 2 3 6 1 8 9
第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9
第三次排序:6和1比较,6大于1,交换位置: 2 3 1 6 8 9
第二趟总共进行了3次比较, 排序结果: 2 3 1 6 8 9
---------------------------------------------------------------------
第四趟排序:
第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9
第二次排序:3和1比较,3大于1,交换位置: 2 1 3 6 8 9
第二趟总共进行了2次比较, 排序结果: 2 1 3 6 8 9
---------------------------------------------------------------------
第五趟排序:
第一次排序:2和1比较,2大于1,交换位置: 1 2 3 6 8 9
第二趟总共进行了1次比较, 排序结果: 1 2 3 6 8 9
---------------------------------------------------------------------
最终结果:1 2 3 6 8 9
---------------------------------------------------------------------
由此可见:N个数字要排序完成,总共进行N-1趟排序,第i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
时间复杂度:
1.最后情况下:数据正序,只需走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。
2.最坏情况下:数据反序,则需要进行n-1趟排序。每趟排序要进行n-i次比较冒泡排序的最坏时间复杂度为:O(n^2) 。
O(n)=n*(n-i) i<n(i表示趟数,最大值为n-1),最小值为1
综上所述:冒泡排序总的平均时间复杂度为:O(n^2) 。
因冒泡排序的简单性和复杂度,故不推荐此排序算法。
相比其他排序算法的优势:它可以检测输入序列是否已经是排序的
* @author Administrator
*
*/
public class BubbleSort {
public static void main(String[] args) {
//N个数字要排序完成,总共进行N-1趟排序,第i趟的排序次数为(N-i)次
//6个数字要排序完成,总共进行6-1趟排序,第4趟的排序次数为(6-4)次
int a[] = {6,3,8,2,9,23};
//BubbleSort(a,a.length);
BubbleSortImproved(a, a.length);
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
}
/**
* 冒泡排序,arr表示需要排序的数组,n表示数组中有n个元素(数组的长度)
* @param arr
* @param n
*/
private static void BubbleSort(int arr[],int n) {
//外层循环控制排序的趟数 //pass表示躺数
for(int pass=1;pass<n;pass++) {
//内层循环控制每趟需要比较多少次
for(int j=1;j<n-pass+1;j++) {
if(arr[j-1]>arr[j]) {
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
}
/**
* 改进版冒泡排序,arr表示需要排序的数组,n表示数组中有n个元素(数组的长度)
* @param arr
* @param n
*/
private static void BubbleSortImproved(int arr[],int n) {
boolean wrapped = true;
//外层循环控制排序的趟数
for(int pass=1;pass<n&&wrapped;pass++) {
wrapped = false;
//若没有数据交换,则这一趟已经符合最终的结果,因此则无需在进行循环了
//内层循环控制每趟需要比较多少次
for(int j=1;j<n-pass+1;j++) {
if(arr[j-1]>arr[j]) {
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
wrapped = true;//如果有数据交换,标志位设置为true
}
}
}
}
}

浙公网安备 33010602011771号