java排序算法综合

摘要

排序算法是最常见的算法,笔试之中往往很多。

package temp; 
  import sun.misc.Sort; 
  /** 
  * @author zengjl 
  * @version 1.0 
  * @since 2007-08-22 
  * @Des java几种基本排序方法 
  */ 
  /** 
  * SortUtil:排序方法 
  * 关于对排序方法的选择:这告诉我们,什么时候用什么排序最好。当人们渴望先知道排在前面的是谁时, 
  * 我们用选择排序;当我们不断拿到新的数并想保持已有的数始终有序时,我们用插入排序;当给出的数 
  * 列已经比较有序,只需要小幅度的调整一下时,我们用冒泡排序。 
  */ 
  public class SortUtil extends Sort { 
  /** 
  * 插入排序法 
  * @param data 
  * @Des 插入排序(Insertion Sort)是,每次从数列中取一个还没有取出过的数,并按照大小关系插入到已经取出的数中使得已经取出的数仍然有序。 
  */ 
  public int[] insertSort(int[] data) { 
  int temp; 
  for (int i = 1; i < data.length; i++) { 
  for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) { 
  swap(data, j, j - 1); 
  } 
  } 
  return data; 
  } 
  /** 
  * 冒泡排序法 
  * @param data 
  * @return 
  * @Des 冒泡排序(Bubble Sort)分为若干趟进行,每一趟排序从前往后比较每两个相邻的元素的大小(因此一趟排序要比较n-1对位置相邻的数)并在 
  *    每次发现前面的那个数比紧接它后的数大时交换位置;进行足够多趟直到某一趟跑完后发现这一趟没有进行任何交换操作(最坏情况下要跑n-1趟, 
  *    这种情况在最小的数位于给定数列的最后面时发生)。事实上,在第一趟冒泡结束后,最后面那个数肯定是最大的了,于是第二次只需要对前面n-1 
  *    个数排序,这又将把这n-1个数中最小的数放到整个数列的倒数第二个位置。这样下去,冒泡排序第i趟结束后后面i个数都已经到位了,第i+1趟实 
  *    际上只考虑前n-i个数(需要的比较次数比前面所说的n-1要小)。这相当于用数学归纳法证明了冒泡排序的正确性 
  */ 
  public int[] bubbleSort(int[] data) { 
  int temp; 
  for (int i = 0; i < data.length; i++) { 
  for (int j = data.length - 1; j > i; j--) { 
  if (data[j] < data[j - 1]) { 
  swap(data, j, j - 1); 
  } 
  } 
  } 
  return data; 
  } 
  /** 
  * 选择排序法 
  * @param data 
  * @return 
  * @Des 选择排序(SelectionSort)是说,每次从数列中找出一个最小的数放到最前面来,再从剩下的n-1个数中选择一个最小的,不断做下去。 
  */ 
  public int[] chooseSort(int[] data) { 
  int temp; 
  for (int i = 0; i < data.length; i++) { 
  int lowIndex = i; 
  for (int j = data.length - 1; j > i; j--) { 
  if (data[j] < data[lowIndex]) { 
  lowIndex = j; 
  } 
  } 
  swap(data, i, lowIndex); 
  } 
  return data; 
  } 
/** 
  * 关于Shell排序讲解 Shell排序算法依赖一种称之为“排序增量”的数列,不同的增量将导致不同的效率。 
  * 假如我们对20个数进行排序,使用的增量为1,3,7。那么,我们首先对这20个数进 
  * 行“7-排序”(7-sortedness)。所谓7-排序,就是按照位置除以7的余数分组进行 
  * 排序。具体地说,我们将把在1、8、15三个位置上的数进行排序,将第2、9、16个 数进行排序,依此类推。这样,对于任意一个数字k,单看A(k), 
  * A(k+7), A(k+14),... 这些数是有序的。7-排序后,我们接着又进行一趟3-排序(别忘了我们使用的排序增量 
  * 为1,3,7)。最后进行1-排序(即普通的排序)后整个Shell算法完成。 
  */ 
  /** 
  * shell排序法 
  * 
  * @param data 
  * @return 
  */ 
  public int[] shellSort(int[] data) { 
  for (int i = data.length / 2; i > 2; i /= 2) { 
  for (int j = 0; j < i; j++) { 
  shellInsertSort(data, j, i); 
  } 
  } 
  shellInsertSort(data, 0, 1); 
  return data; 
  } 
  /** 
  * shell排序“排序增量”方法 
  * 
  * @param data 
  * @param start 
  * @param inc 
  */ 
  public void shellInsertSort(int[] data, int start, int inc) { 
  int temp; 
  for (int i = start + inc; i < data.length; i += inc) { 
  for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) { 
  swap(data, j, j - inc); 
  } 
  } 
  } 
  /** 
  * 快速排序法 
  * 
  * @param data 
  * @return 
  */ 
  private static int MAX_STACK_SIZE = 4096; 
  private static int THRESHOLD = 10; 
  public int[] quickSort(int[] data) { 
  int[] stack = new int[MAX_STACK_SIZE]; 
  int top = -1; 
  int pivot; 
  int pivotIndex, l, r; 
  stack[++top] = 0; 
  stack[++top] = data.length - 1; 
  while (top > 0) { 
  int j = stack[top--]; 
  int i = stack[top--]; 
  pivotIndex = (i + j) / 2; 
  pivot = data[pivotIndex]; 
  swap(data, pivotIndex, j); 
  // partition 
  l = i - 1; 
  r = j; 
  do { 
  while (data[++l] < pivot) 
  ; 
  while ((r != 0) && (data[--r] > pivot)) 
  ; 
  swap(data, l, r); 
  } while (l < r); 
  swap(data, l, r); 
  swap(data, l, j); 
  if ((l - i) > THRESHOLD) { 
  stack[++top] = i; 
  stack[++top] = l - 1; 
  } 
  if ((j - l) > THRESHOLD) { 
  stack[++top] = l + 1; 
  stack[++top] = j; 
  } 
  } 
  // 插入排序 
  insertSort(data); 
  return data; 
  } 
/** 
  * 归并排序法 
  * 
  * @param data 
  * @return 
  */ 
  public int[] improvedMergeSort(int[] data) { 
  int[] temp = new int[data.length]; 
  mergeSort(data, temp, 0, data.length - 1); 
  return data; 
  } 
  /** 
  * 合并排序 
  * @param data 
  * @param temp 
  * @param l 
  * @param r 
  */ 
  private void mergeSort(int[] data, int[] temp, int l, int r) { 
  int i, j, k; 
  int mid = (l + r) / 2; 
  if (l == r) 
  return; 
  if ((mid - l) >= THRESHOLD) 
  mergeSort(data, temp, l, mid); 
  else 
  insertSort(data, l, mid - l + 1); 
  if ((r - mid) > THRESHOLD) 
  mergeSort(data, temp, mid + 1, r); 
  else 
  insertSort(data, mid + 1, r - mid); 
  for (i = l; i <= mid; i++) { 
  temp[i] = data[i]; 
  } 
  for (j = 1; j <= r - mid; j++) { 
  temp[r - j + 1] = data[j + mid]; 
  } 
  int a = temp[l]; 
  int b = temp[r]; 
  for (i = l, j = r, k = l; k <= r; k++) { 
  if (a < b) { 
  data[k] = temp[i++]; 
  a = temp[i]; 
  } else { 
  data[k] = temp[j--]; 
  b = temp[j]; 
  } 
  } 
  } 
  private void insertSort(int[] data, int start, int len) { 
  for (int i = start + 1; i < start + len; i++) { 
  for (int j = i; (j > start) && data[j] < data[j - 1]; j--) { 
  swap(data, j, j - 1); 
  } 
  } 
  } 
  /** 
  * 交换数据顺序 
  * 
  * @param data 
  * @param i 
  * @param j 
  */ 
  private void swap(int[] data, int i, int j) { 
  int temp = data[i]; 
  data[i] = data[j]; 
  data[j] = temp; 
  } 
  public static void main(String[] args){ 
  int[] data = {-2,1,2,4,2,0,4,555,3,99}; 
  SortUtil sort = new SortUtil(); 
  System.out.println(System.currentTimeMillis()); 
  data = sort.bubbleSort(data) ; 
  String str = "" ; 
  for(int i = 0 ; i < data.length ; i ++ ){ 
  str = str + data[i]+","; 
  } 
  System.out.println(str); 
  System.out.println(System.currentTimeMillis()); 
  } 
  }


IT家园
IT家园

网友最新评论 (0)

发表我的评论
取消评论
表情