在今天的java入门课上,我们小组讲解了有关于冒泡排序的相关算法,因为冒泡排序方法比较简单,所以为了内容更加丰富,我们小组又添加了两种改良的冒泡排序算法:
(1)通过加入一个flag来判断本次是否进行过交换,若交换过,则继续下一次,否则结束排序;
(2)进行双向冒泡排序,同时拿到序列的最大值与最小值;
冒泡排序的基本思想:
把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻的气泡总能浮在重的气泡上面,直到最轻的气泡浮到最上面;保持最后浮出的气泡不变,对余下气泡循环上述步骤,直到所有气泡从轻到重排列完毕。
下面是根据冒泡排序的基本思想编写的基础代码:
class Solusion{ /** * 冒泡排序算法 * @param unsorted */ public static void bubble(int[] unsorted){ int n = unsorted.length-1; //数组长度 while(n>0){ int i = 0; int j = i+1; while(j<=n){ if(unsorted[i]>unsorted[j]){ int temp = unsorted[i]; unsorted[i] = unsorted[j]; unsorted[j] = temp; } i++; j++; } n--; } } }
当然,冒泡排序还有另外的实现方式,使用一种暴力的方式,按照冒泡排序的规则进行排序,具体的代码实现如下:
class Solusion{ /** * 暴力冒泡排序 * @param unsorted */ public static void bubble(int[] unsorted){ int temp = 0; for(int i = 0;i<unsorted.length;i++){ for(int j = i+1;j<unsorted.length;j++){ if(unsorted[i]>unsorted[j]){ temp = unsorted[i]; unsorted[i] = unsorted[j]; unsorted[j] = temp; } } } } }
冒泡排序优化算法1:通过加入一个flag来判断本次是否进行过交换,若交换过,则继续下一次,否则结束排序;
class Solution{ public static void bubble_1(int r[], int n) { int i = n - 1; // 初始时,最后位置保持不变 while (i > 0) { int pos = 0; // 每趟开始时,无记录交换 for (int j = 0; j < i; j++) if (r[j] > r[j + 1]) { pos = j; // 记录交换的位置 int tmp = r[j]; r[j] = r[j + 1]; r[j + 1] = tmp; } i = pos; // 为下一趟排序作准备 } } }
冒泡排序优化算法2:进行双向冒泡排序,同时拿到序列的最大值与最小值;
class Solution{ public static void bubble_2(int r[], int n) { int low = 0; int high = n - 1; // 设置变量的初始值 int tmp, j; while (low < high) { for (j = low; j < high; ++j) // 正向冒泡,找到最大者 if (r[j] > r[j + 1]) { tmp = r[j]; r[j] = r[j + 1]; r[j + 1] = tmp; } --high; // 修改high值, 前移一位 for (j = high; j > low; --j) // 反向冒泡,找到最小者 if (r[j] < r[j - 1]) { tmp = r[j]; r[j] = r[j - 1]; r[j - 1] = tmp; } ++low; // 修改low值,后移一位 } } }