java排序算法综合_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java排序算法综合

java排序算法综合

 2011/12/20 10:53:41  xuehua1987  http://xuehua1987.iteye.com  我要评论(0)
  • 摘要:packagetemp;importsun.misc.Sort;/***@authorzengjl*@version1.0*@since2007-08-22*@Desjava几种基本排序方法*//***SortUtil:排序方法*关于对排序方法的选择:这告诉我们,什么时候用什么排序最好。当人们渴望先知道排在前面的是谁时,*我们用选择排序;当我们不断拿到新的数并想保持已有的数始终有序时,我们用插入排序;当给出的数*列已经比较有序,只需要小幅度的调整一下时,我们用冒泡排序
  • 标签: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());

  }

  }
发表评论
用户名: 匿名