冒泡排序:相邻元素两两比较,大的往后方放,第一次完毕后,最大值就出现在了最大索引处。同理,继续,即可得到一个排好序的数组。
规律:
1. 两两比较,大的往后放。
2. 第一次比较完毕后,下一次比较的时候就会减少一个元素的比较。
3. 第一次比较,有0个元素不比
第二次比较,有1个元素不比
第三次比较,有2个元素不比
4. 总共需要比较数组长度-1次。
代码如下:
package 算法;
public class BubbleSort { public static void main(String[] args) { //定义一个数组 int[] arr = {6,1,2,7,9,3,4,5,10,8}; //冒泡排序将数组从小到大排序 for(int x=0;x<arr.length-1;x++){ for(int y=0;y<arr.length-1-x;y++){ if(arr[y]>arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } //遍历排好序的数组 for(int i:arr){ System.out.print(" "+i); } } } |
优化版:
- 常规冒泡排序
- 加有序标志
- 加无序数列边界
package 冒泡排序;
public class BubbleSort { public static void main(String[] args) { //定义一个数组 int[] arr = {3,354,465,7,45,56,324,45,5};
//调用函数,冒泡排序 bubbleSort(arr);
//打印数组 for(int i:arr){ System.out.print(i+" "); } }
//冒泡排序 private static void bubbleSort(int[] arr) { //记录最后一次交换的位置 int lastExchangeIndex = 0; //无序数列的边界,每次比较只需要比较到这里为止 int sortBorder = arr.length-1; for(int i=0;i<arr.length-1;i++){ //定义有序标记,每一轮的初始值是true boolean isSorted = true; for(int j=0;j<sortBorder;j++){ if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; //将有序标志的值改为false isSorted = false; lastExchangeIndex = j; } } sortBorder = lastExchangeIndex; //若有序,结束循环 if(isSorted){ break; } } } } |