标签:
冒泡排序即每次遍历。相邻数字间进行比较,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置;算法关键要点在于确定每次循环的边界;
后面两种算法则是对冒泡排序一定程度上的改良,但相对于其他排序算法,冒泡排序性能依然较差。
//冒泡排序 public class Bubble_Sort { //最原始的解法 public void bubble_sort1(int[] data) { int n = data.length; for(int i = 0; i < n; i++) { //注意循环的index范围,避免溢出 for(int j = 0; j < n - i - 1; j++) { if(data[j] > data[j + 1]) { swap(data, j , j + 1); } } } } //改进算法,通过引入一个标志量flag,判断一次循环是否有移动,若无移动,则表示 //排序已经完成,无需在进行下一次继续循环 public void bubble_sort2(int[] data) { int n = data.length; boolean flag = true;//标示是否进行了移动 int index = n - 1; //标示需要循环的最后一位的index //一旦在移动,则继续循环 while(flag) { flag = false; for(int j = 0; j < index - 1; j++) { if(data[j] > data[j + 1]) { swap(data, j , j + 1); flag = true; } } index--; } } //改进算法二:当一次遍历中,最后m位都未进行转换,则表示后面n位都比当前这个最大数要大 //根据冒泡排序知,每次沉入最大值,则后面这些位一定已经排好序 public void bubble_sort3(int[] data) { int n = data.length; int index = n - 1; while(index != 0) { int k = 0; for(int j = 0; j < index - 1; j++) { if(data[j] > data[j + 1]) { swap(data, j , j + 1); k = j; } } index = k; } } //无法像C++一样使用引用实现,故只好使用data数组进行改变 private void swap(int[] data , int a, int b) { int temp = data[a]; data[a] = data[b]; data[b] = temp; } public void print_array(int[] data) { for(int num : data) { System.out.print(num); System.out.print(" "); } } public static void main(String[] args) { Bubble_Sort bubble_Sort = new Bubble_Sort(); int data[] = {2,34,45,2,13,24,5,24,57}; bubble_Sort.bubble_sort3(data); bubble_Sort.print_array(data); } }
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/44274497