`

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());

  }

  }
分享到:
评论

相关推荐

    java的两种冒泡排序算法

    ### Java中的两种冒泡排序算法 #### 知识点一:基本冒泡排序算法 冒泡排序是一种简单的排序算法,其基本思想是通过不断...在实际应用中,选择合适的排序算法是非常重要的,需要综合考虑数据的特点、性能需求等因素。

    java+GUI界面各种排序算法性能比较

    在Java编程语言中,图形用户界面...总的来说,"java+GUI界面各种排序算法性能比较"项目是一个结合了基础编程、图形用户界面设计、算法实现和性能分析的综合性学习资源,适合初学者和有经验的开发者进行实践和研究。

    排序算法的综合实例(源程序+设计文档)

    29. 排序综合(限1 人完成) 利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。 要求: ...PS:采用了直接选择排序算法、冒泡排序、希尔排序、直接插入排序这四种排序算法。

    JAVA版BM25排序模型

    **JAVA版BM25排序模型详解** BM25(Best Match 25)是一种在信息检索领域广泛应用的文档排名算法,它基于TF-IDF(词频-逆文档频率)理论,但进行了改进,能更好地考虑文档长度的影响。在这个JAVA版的实现中,我们...

    用Java实现几种常见的排序算法

    在Java中,`java.util.Arrays`类提供了`sort()`方法,它可以对整数、浮点数、字符及对象数组进行排序,底层使用的是TimSort,一种稳定的排序算法,综合了插入排序、归并排序和自底向上的归并排序。 这些排序算法各...

    Java排序算法[定义].pdf

    Java排序算法是编程中不可或缺的一部分,用于组织和优化数据。以下是对这些算法的详细解析: 1. 插入排序: - 直接插入排序:它通过比较元素并将每个元素插入到正确的位置来工作。时间复杂度为O(n^2),但在最好...

    java数据结构大作业,排序算法是性能比较

    在Java数据结构的学习中,排序算法的...总体来说,这个Java数据结构的大作业是一个综合性的项目,不仅要求实现多种排序算法,还涉及到性能测试和分析,有助于提升对数据结构和算法的理解,以及在实际编程中的应用能力。

    Java常用算法手册(jb51.net)_Java常用算法手册_

    这本书的覆盖范围广泛,涉及到算法基础、数据结构、排序算法、查找算法、图论、动态规划等多个重要领域。 在算法基础部分,书中会详细介绍如何用Java实现基本的逻辑控制结构,如循环、条件判断,以及基础的递归思想...

    最新最全的排序方法 Java 源代码

    在IT领域,排序算法是计算机科学中的基础概念,特别是在编程语言如Java中,掌握各种排序方法对于提升程序性能至关重要。...在选择排序算法时,应根据数据规模、稳定性需求以及是否允许原地排序等因素综合考虑。

    Java各种排序算法、Java游戏和实例代码集合

    在这个"Java各种排序算法、Java游戏和实例代码集合"中,我们可以深入学习Java编程的核心技术,并通过实践加强理解。以下是一些关键知识点的详细说明: 1. **排序算法**: - **冒泡排序**:是最基础的排序算法之一...

    各种排序算法java实现

    标题 "各种排序算法java实现" 暗示了这篇内容主要关注的是在Java编程语言中实现不同的排序算法。排序算法是计算机科学中的基础概念,它们用于对一组数据进行有序排列,广泛应用于各种数据处理和分析任务。Java作为...

    所有排序的写法(Java).zip

    这里我们主要探讨的是使用Java实现的几种经典排序算法,包括直接选择排序、堆排序、冒泡排序、快速排序、直接插入排序、折半插入排序、Shell排序、归并排序、桶式排序和基数排序。这些算法各有特点,适用于不同的...

    Java编程实现中英混合字符串数组按首字母排序的方法

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...

    java GUI 实现冒泡排序

    冒泡排序是一种基础的排序算法,...这个项目不仅涵盖了冒泡排序算法,还涉及到了Java GUI编程、字符串处理、数组操作等多个知识点。通过这样的实践,开发者可以更好地理解和掌握这些概念,并且提升软件开发的综合能力。

    Java算法大全源码包开源源码

    其次,算法部分可能会涵盖经典的排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。这些排序算法各有优缺点,理解它们的工作原理和时间复杂度,有助于在实际开发中选择最适合的排序方式。 ...

    数据结构课程设计——排序综合课程设计

    在“排序综合课程设计”中,学生通常会被要求实现多种排序算法,并对它们进行性能分析。这个项目可以由四个人合作完成,以分担工作量,同时通过团队协作提升沟通与协同能力。 在这个课程设计中,以下几个关键知识点...

    java综合面试题java综合面试题

    常见的排序算法包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序等。 9. **Overload 和 Override 的区别?Overloaded 的方法是否可以改变返回值的类型?** - Overload(重载)是方法名...

    java 可输入的冒泡排序

    可输入的冒泡排序法~ 综合更改的版本~ java ban

    箱子排序BInSort图形界面演示(JAVA)

    【箱子排序BInSort图形界面演示(JAVA)】 ...总的来说,这个"箱子排序BInSort图形界面演示(JAVA)"项目提供了一个交互式的学习工具,使得复杂的排序算法变得生动有趣,有助于提高编程爱好者和学习者的技能水平。

    各种排序算法的稳定性和时间复杂度小结

    总的来说,选择合适的排序算法应根据数据特性、稳定性需求和性能要求综合考虑。在处理大量数据时,优先考虑时间复杂度较低的算法;在对稳定性有特定要求的情况下,应选用稳定的排序算法。了解各种排序算法的特性和...

Global site tag (gtag.js) - Google Analytics