java基本演算法總結(冒泡排序、選擇排序、插入排序)

來源:互聯網
上載者:User

 

package com.java.dataStructArithmeic.sort;

/**
 * @author gongpeibao
 * @since 2012.03.16
 * 基本排序方法
 * 選擇排序放比冒泡排序效率高,原因是它的交換次數少了,比較次數都是N*(N-1)/2
 * 插入排序法是這兒最好的一種基本排序方法,雖然排序演算法仍然需要O(N^2)的時間,
 * 但是一般情況下比冒泡排序快一倍,比選擇排序還要快一點
 * 應用方法:
 * 在資料量很小,並且交換資料相對於比較資料 更加耗時的情況下,應用選擇排序
 * 假設資料量很小或基本上有序時,插入排序演算法是最好的選擇
 * 對於大資料量的排序來說,快速排序是最好的方法
 */
public class BubbleSort {
 
 public static void main(String[] args) {
//  int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5 }; //數組
  int[] values = { 3, 1, 6}; //數組
//  BubbleSort.bubbleSort(values); //冒泡排序
//  selectSort(values);  //選擇排序
  insertSort2(values);  //插入排序
  int length = values.length;
  for (int i = 0; i < length; i++) {
   System.out.println(values[i]);
  }
 }
 /**
  * 冒泡排序法
  * @param values 排序數組
  */
 public static void bubbleSort(int[] values) {
  int length = values.length;
  // 外面的for迴圈控制趟數
  for (int i = 0; i < length; i++) {
   // 裡面的for迴圈控制比較次數
   for (int j = 0; j < length - i - 1; j++) {
    // 滿足條件則交換資料
    if (values[j] > values[j + 1]) {
     int temp = values[j];
     values[j] = values[j + 1];
     values[j + 1] = temp;

    }
   }
  }
 }
 /**
  * 選擇排序法
  * 交換次數從O(N^2) 降到了O(N)
  * @param values 排序數組
  * 直接選擇排序演算法的思想比較簡單:(假設資料放在一個數組a中,且數組的長度是N)
  * 從a[0]-a[N-1]中選出最小的資料,然後與a[0]交換位置
  * 從a[1]-a[N-1]中選出最小的資料,然後與a[1]交換位置(第1步結束後a[0]就是N個數的最小值)
  * 從a[2]-a[N-1]中選出最小的資料,然後與a[2]交換位置(第2步結束後a[1]就是N-1個數的最小值)
  * 以此類推,N-1次排序後,待排資料就已經按照從小到大的順序排列了。
  * */
 public static void selectSort(int[] values){
  int length = values.length;
  for(int i = 0; i < length-1; ++i)
  {
            int k = i;  //記錄第一個元素的位置,作為比較基準
            for(int j = i; j < length; ++j)
            {
             //如果有比基準小的值,則用小的作為新的基準,同時選出最小的值
                if(values[k] > values[j])
                {
                    k = j;
                }
            }
            if(k != i)
            {
             //交換元素
                int temp = values[i];
                values[i] = values[k];
                values[k] = temp;
            }
        }
 }
 /**
  * 插入排序法
  * @param values 排序數組
  */
 public static void insertSort(int[] values){
  int length = values.length;
  for(int i = 1;i <length; i++){
            int j = -1;
          //找到element[i]應該擺放的位置,此處可以利用尋找演算法進行最佳化
            while(j <= i && values[i] > values[++j])
             {
              System.out.println(values[i]+"-"+values[++j]);
             };   //分號,進行空處理
            if(j < i){
                //將j之後的資料移動一位,然後把values[i]移動到j處
                int temp = values[i]; //迴圈把數組第二個值放到temp裡
                for(int k = i-1;k >= j;k--){
                    values[k+1] = values[k];
                }
                values[j] = temp;
            }
        }
 }
 /**
  * 插入排序法 方法2更容易理解
  * @param values 排序數組
  * 不變性
  * 每趟結束時,在temp位置的項插入後,比outer小的下標的資料項目都是局部有序的
  */
 public static void insertSort2(int[] values){
  int length = values.length;
  for(int i = 1;i<length;i++){
   //迴圈把數組第二個值放到temp裡
   int tmp = values[i];
   int j = i-1; //從左邊的第一個開始比較
   while(tmp<values[j]){ //迴圈
    values[j+1] = values[j]; //右移一個
    j--;
    if(j == -1) //判斷當前元素是否是第一個元素,如果是第一個元素,則停止迴圈
     break;
   }
   values[j+1] = tmp; //將拿出來的那個放到比其小的位置
  }
 }
 

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.