數據結構與算法-冒泡排序

數據結構與算法-冒泡排序

概述:
原理:https://visualgo.net/zh/sorting?slide=6 看圖理解方便點
時間複雜度O(n^2)
空間複雜度O(1)
適用場景:大部分元素已有序
參考鏈接:

https://mp.weixin.qq.com/s/wO11PDZSM5pQ0DfbQjKRQA

看了以後發現連冒泡都不會了

由於排序數組長度較小(手打的測試數組),難以用時間判斷,這裏使用count用於記錄比較次數,判斷是否優化。使用時請刪除。
第一版

/**
  * 基礎版
  */
 public static void sort1(int[] list) {
  int count =0;
  int temp;
  int n = list.length;
  for(int i=0;i<n;i++) {
   for(int j=0;j<n-i-1;j++) {
    if(list[j]>list[j+1]) {
     temp = list[j+1];
     list[j+1]=list[j];
     list[j]=temp;
    }
    count++;
   }
  }
  System.out.println(count);
 }

第二版
如果當前這一輪比較時發現當前序列都已經有序(沒有進行交換操作),則退出循環

/**
  * 如果已經有序,提前退出
  */
 public static void sort2(int[] list) {
  int count =0;
  int n = list.length;
  for(int i=0;i<n;i++) {
   boolean isSort = true;
   for(int j=0;j<n-i-1;j++) {
    if(list[j]>list[j+1]) {
     int temp = list[j+1];
     list[j+1]=list[j];
     list[j]=temp;
     isSort=false;
    }
    count++;
   }
   if(isSort) {
    break;
   }
  }
  System.out.println(count);
 }

第三版
當前輪比較完成之後可能發現後續的序列有不少已經有序,根據把上一輪最後一次交換的位置判斷已有有序區間長度,作爲下一輪結束位置。

/**
  * 修改有序區間長度
  */
 public static void sort3(int[] list) {
  int count =0;
  int n = list.length;
  int lastExChangeIndex = 0;
  int sortBorder = n-1;
  for(int i=0;i<n;i++) {
   boolean isSort = true;
   for(int j=0;j<sortBorder;j++) {
    if(list[j]>list[j+1]) {
     int temp = list[j+1];
     list[j+1]=list[j];
     list[j]=temp;
     //當前序列不是有序的
     isSort=false;
     //最後一次更新位置
     lastExChangeIndex=j;
    }
    count++;
   }
   sortBorder = lastExChangeIndex;
   if(isSort) {
    break;
   }
  }
  System.out.println(count);
 }

第四版
進行雙向冒泡

/**
  * 雞尾酒排序,雙向冒泡
  */
 public static void sort4(int[] list) {
  int count =0;
  int n = list.length;
  int lastRightExChangeIndex = 0;
  int lastLeftExChangeIndex = 0;
  int rightSortBorder = n-1;
  int leftSortBorder = 0;
  for(int i=0;i<n/2;i++) {
   //正向冒泡
   boolean isSort = true;
   for(int j=leftSortBorder;j<rightSortBorder;j++) {
    if(list[j]>list[j+1]) {
     int temp = list[j+1];
     list[j+1]=list[j];
     list[j]=temp;
     //當前序列不是有序的
     isSort=false;
     //最後一次更新位置
     lastRightExChangeIndex=j;
    }
    count++;
   }
   rightSortBorder = lastRightExChangeIndex;
   if(isSort) {
    break;
   }
   //反向冒泡
   isSort = true;
   for(int j=rightSortBorder;j>leftSortBorder;j--) {
    if(list[j-1]>list[j]) {
     int temp = list[j];
     list[j]=list[j-1];
     list[j-1]=temp;
     //當前序列不是有序的
     isSort=false;
     //最後一次更新位置
     lastLeftExChangeIndex=j;
    }
    count++;
   }
   leftSortBorder = lastLeftExChangeIndex;
   if(isSort) {
    break;
   }
  }
  System.out.println(count);
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章