三種常用的排序方法(冒泡/選擇/快速)


1、冒泡排序(Bubble Sort)O(n²)

/**
* 1.比較相鄰兩個數據如果。第一個比第二個大,就交換兩個數
*
* 2.對每一個相鄰的數做同樣1的工作,這樣從開始一隊到結尾一隊在最后的數就是最大的數。
*
* 3.針對所有元素上面的操作,除了最后一個。
*
* 4.重復1~3步驟,知道順序完成。
*/

//外圈從0到n-1

for(int i=0;i<arr.length-1;i++){

  //內循環從1到n
  for(int j=i+1;j<arr.length;j++){

    //每次對比兩數,a>b交換,保持右邊大於左邊
    if(arr[i]>arr[j]){
      int temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
  }
}

 

2.選擇排序(SelectSrot)O(n²)

/**
* 1.在一個長度為 N 的無序數組中,第一次遍歷 n-1 個數找到最小的和第一個數交換。
*
* 2.第二次從下一個數開始遍歷 n-2 個數,找到最小的數和第二個數交換。
*
* 3.重復以上操作直到第 n-1 次遍歷最小的數和第 n-1 個數交換,排序完成。
*/

for(int i = 0;i<arr.length-1;i++){
  //記錄第一個數的索引
  int min = i;
  //從1開始判斷下個數時候小於最小數,若小於則最小索引置為此數
  for(int j = i+1;j<arr.length;j++){
    if(arr[j]<arr[min]){
      min = j;
    }
  }
  //將得到的最小數與第一個數交換
  int temp = arr[i];
  arr[i] = arr[min];
  arr[min] = temp;
}

3.//快速排序(QuickSort)O (nlogn)

/**
* 二分思想
* 1.取數組第一個數arr[0]為基准數,記錄此值
* 2.從arr[1]向右判斷是否比基准數大,取第一個出現的數
* 從arr[arr.length-1]向左判斷是否比基准數小,取第一個出現的數
* 3.判斷2中兩個數的index,i是否大於j,若i<j則兩數交換
* 4.第一輪結束后,將基准數和重復1-3步驟操作
*/

private static void quickSort(int[] arr,int low,int high) {
  if(low>high){
    return;
  }
  int temp = arr[low];
  int i = low;
  int j = high;
  while(i<j){
    //!先從右向左判斷,找到一個比基准數小的數
    while(temp<=arr[j]&&i<j){
      j--;
    }
    //從左到右判斷,找到一個比基准數大的數
    while(temp>=arr[i]&&i<j){
      i++;
    }
    //判斷兩數索引大小
    if(i<j){
      int c = arr[i];
      arr[i] = arr[j];
      arr[j] = c;
    }
  }
  //將基准數與排序后的左半段索引交換
  arr[low] = arr[i];
  arr[i] = temp;
  //遞歸將左右兩段繼續排序
  quickSort(arr, low, j-1);
  quickSort(arr, j+1, arr.length-1);
}

排序速度:快速 > 選擇 > 冒泡

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM