五种排序(冒泡、插入、选择、希尔、快排)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]);
   }
  }
}
阅读更多

没有更多推荐了,返回首页