1. 程式人生 > >Java 常用算法(冒泡、選擇、插入、快排)

Java 常用算法(冒泡、選擇、插入、快排)

-i 最小 代碼 遞歸 最小數 sta 判斷 程序 就是

1. 冒泡排序的實現

冒泡排序是所有排序算法中最基本、最簡單的一種。思想就是交換排序,通過比較和交換相鄰的數據來達到排序的目的。

設數組的長度為N:

  1、比較前後相鄰的二個數據,如果前面數據大於後面的數據,就將這二個數據交換。

  2、這樣對數組的第0個數據到N-1個數據進行一次遍歷後,最大的一個數據就“沈”到數組第N-1個位置。

  3、N=N-1,如果N不為0就重復前面二步,否則排序完成。

按照這個定義很快就能寫出代碼:

public static void sort(int[] arr){
  int n = arr.length;
  for (int i = 0; i < n; i++) {
    for (int j = 1; j < n-i; j++) {
      if(arr[j-1] > arr[j]){
        int temp = arr[j-1];
        arr[j-1] = arr[j];
        arr[j] = temp;
      }
    }
  }
}

2. 選擇排序的實現

選擇排序算法在每一步中選取最小值來重新排序,通過選擇和交換來實現排序。   具體流程如下:   1、首先從原數組中選擇最小的1個數據,將其置於第一個位置。   2、然後從剩下的數據中再選擇其中最小的一個數據,並將其置於原數組的第二個位置。   3、不斷重復選擇和交換的過程,直至最後排序完成。

public static void sort(int[] arr){
  int temp ;
  int small;
  for (int i = 0; i < arr.length; i++) {
    small = i;
    //找出最小數的下標
    for (int j = i+1; j < arr.length; j++) {
      if(arr[j] < arr[small]){
        small = j;
      }
    }
    //交換
    if(small != i){
      temp = arr[i];
      arr[i] = arr[small];
      arr[small] = temp;
    }
  }
}

3. 插入排序的實現

直接插入排序是將未排序的數據插入至已排好序序列的合適位置。   具體流程如下:   1、首先比較數組的前兩個數據,並排序;   2、比較第三個元素與前兩個排好序的數據,並將第三個元素放入適當的位置;   3、比較第四個元素與前三個排好序的數據,並將第四個元素放入適當的位置;    ......   4、直至把最後一個元素放入適當的位置。 public static void sort(int[] arr){

  int temp ;
  for (int i = 1; i < arr.length; i++) {
    //待插入的數據
    temp = arr[i];
    int j;
    for (j = i-1; j >= 0; j--) {
      //判斷是否大於 temp, 大於則後移
      if(arr[j] > temp){
        arr[j+1] = arr[j];
      }else{
        break;
      }
    }
    arr[j+1] = temp;
  }
}

4. 快速排序的實現

快速排序,顧名思義,是一種速度快,效率高的排序算法。

快排原理: 在要排的數(比如數組A)中選擇一個中心值key(比如A[0]),通過一趟排序將數組A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重復這個過程,直到整個有序。 整個快排的過程就簡化為了一趟排序的過程,然後遞歸調用就行了。 一趟排序的方法: 1、定義i=0,j=A.lenght-1,i為第一個數的下標,j為最後一個數下標 2、從數組的最後一個數Aj從右往左找,找到第一小於key的數,記為Aj; 3、從數組的第一個數Ai 從左往右找,找到第一個大於key的數,記為Ai; 4、交換Ai 和Aj 5、重復這個過程,直到 i=j 6、調整key的位置,把A[i] 和key交換

public static void sort(int arr[],int low,int high){
  //1. 找到程序的出口
  if( low > high){
    return;
  }
  //2. 存
  int i = low;
  int j = high;
  //3. key
  int key = arr[i];
  //4. 完成一次比較
  while(i < j){
    //4.1 從右邊找到一個小於key的數
    while(i<j && arr[j] > key){
      j--;
    }  
    // 4.2 從左邊找到一個大於key的數
    while(i<j && arr[i] <= key){
      i++;
    }
    //4.3 交換
    if(i<j){
      int p = arr[i];
      arr[i] = arr[j];
      arr[j] = p;
    }
  }
  //4.4 跳轉key 的位置
  int p = arr[i];
  arr[i] = arr[low];
  arr[low] = p;
  //5. 對 key 左邊的數據快速排序
  sort(arr,low,i-1);
  //6. 對 key 右邊的數據快速排序
  sort(arr,i+1,high);
}

Java 常用算法(冒泡、選擇、插入、快排)