1. 程式人生 > >五種排序(冒泡、插入、選擇、希爾、快排)java版

五種排序(冒泡、插入、選擇、希爾、快排)java版

package com.sort; public class SortMain {
 static int[] array = { 1, -3, 9, 12, 5, 7, 27, -7, 19, 3, 6, 29 };
 static int length = array.length;
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //以下全是從小大小排序
  
//         bubbleSort();
//  insertSort();
//         outputData();
         selectionSort();
         outputData();
 }
 /*
  * 氣泡排序-相鄰的兩個數進行比較交換值
  * i=0時最小的值在最左邊, i=1把第二小的值放
  */
 public static void bubbleSort() {
  int length = array.length;
  for (int i = 0; i < length; i++)
   for (int j = 0; j < length - 1; j++) {
    if (array[i] < array[j]) {
     int temp = array[i];
     array[i] = array[j];
     array[j] = temp;
    }
   }
 }
 /*
  * 插入排序 在排列好的列表中一個個插入
  */
 public static void insertSort() {
  for (int i = 1; i < length; i++) {
   int j=i;
   int temp = array[i];
   // 在已排好的i個數組中 查詢temp
//   if(temp<array[j-1])
   for (j = i; j > 0 &&temp<array[j-1]; j--) {
    
    array[j] = array[j - 1];
   }
   array[j]=temp;
  
  }
 }
 /*
  * 選擇排序 每次選好最好的值並做好位置標記並交換位置
  */
 public static void selectionSort() {
  for(int i=0;i<length;i++) {
   int flag=i;// 將當前下標定義為最小值下標
   int temp=array[i];   
   for(int j=i+1;j<length;j++)
    if(array[j]<temp) {
     temp=array[j];
     flag=j;
    }
     
   if(flag!=i) {
    array[flag]=array[i];
    array[i]=temp;
    
   }
  }
 }
 // 希爾排序 減少了陣列的移動次數 再結合插入排序
  public static void shellSort() {
   int h = 1;
   while (h < length / 3) {
    h = h * 3 + 1;
   }
   while (h > 0) {
    for (int i = h; i < length; i++) {
     int j;
     int temp = array[i];
     // 在已排好的i個數組中 查詢temp
     for (j = i; j > h - 1 && temp < array[j - h]; j -= h) {
      array[j] = array[j - h];
     }
     array[j] = temp;
    }
    h = (h - 1) / 3;
   }
  }
  /*
   * 快速排序 把陣列劃分兩個子陣列 一直劃分下去 關鍵字劃分
   * 具體實現自己想看程式碼  我也猜不透
   */
  
  public static void fastsort(int left, int right) {
   if (right - left <= 0)
    return;
   int point = array[right];
   int partition = partition(left, right, point);
   fastsort(left, partition - 1);
   fastsort(partition + 1, right);
  }   public static int partition(int left, int right, int point) {
   int leftPtr = left - 1;
   int rightPtr = right;
   while (true) {
    // 將比關鍵字小的留在左端
    while (leftPtr < rightPtr && array[++leftPtr] < point)
     ;
    // 將比關鍵字大的留在右端
    while (rightPtr < leftPtr && array[--rightPtr] < point)
     ;
    if (leftPtr >= rightPtr)
     break;
    else {
     int temp = array[leftPtr];
     array[leftPtr] = array[rightPtr];
     array[rightPtr] = temp;
    }
   }
   int temp = array[leftPtr];
   array[leftPtr] = array[rightPtr];
   array[rightPtr] = temp;
   return leftPtr;
  }
 // 遍歷輸出陣列
  public static void outputData() {
   for (int i = 0; i < length; i++) {
    System.out.printf(" " + array[i]);
   }
  } }