`
fuhao_987
  • 浏览: 63666 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

常用排序算法-java实现(希尔,归并)

    博客分类:
  • Java
阅读更多
3、希尔排序
/*
* Shellsort, using a sequence suggested by Gonnet.
* @param a an array of Comparable items.
*/
public static void shellsort( Comparable [] a ){
   for( int gap = a.length / 2; gap > 0; gap = gap==2?1:(int) (gap/2.2))
        for( int i = gap; i< a.length; i++){
            Comparable tmp = a[i];
            int j = i;
            for( ; j > gap && tmp.compareTo( a[j-gap]) < 0; j -= gap)
                a[j] = a[j-gap];
            a[j] = tmp;
        }
}

思想是:首先,比较相隔最远的元素;然后比较距离次远的元素,依次类推,逐渐向基本的插入排序靠拢。
实际中,甚至在N为上万的情况下,希尔排序的性能也是相当好的。代码的简单性使它成为排序中等规模输入的良好算法。
平均运行时间降到O(N5/4)

4、归并排序
/*
*  Mergesort algorithm.
*  @param a an array of Comparable items.
*/
public static void mergeSort( Comparable [] a){
      Comparable [] tmpArray = new Comparable[a.length];
      mergeSort( a, tmpArray, 0 , a.length-1 );
}
/*
* Internal method that makes recursive calls.
* @param a an array of Comparable items.
* @param tmpArray an array to place the merged result.
* @param left the left-most index of the subarray.
* @param right the right-most index of the subarray.
*/
private static void mergeSort( Comparable [] a, Comparable[] tmpArray, int left, int right){
   if( left < right ){
      int center = (left + right) / 2;
      mergeSort(a, tmpArray, left, center);
      mergeSort(a, tmpArray, center + 1, right);
      merge(a, tmpArray, left, center+1, right);
   }
}
/*
* Internal method that merges two sorted halves of a subarray.
* @param a an array of Comparable items.
* @param tmpArray an array to place the merged result.
* @param leftPos the left-most index of the subarray.
* @param rightPos the index of the start of the second half.
* @param rightEnd the right-most index of the subarray.
*/
private static void merge(Comparable [] a, Comparable [] tmpArray,
                         int leftPos, int rightPos, int rightEnd){
    int leftEnd = rightPos - 1;
    int tmpPos = leftPos;
    int numElements = rightEnd - leftPos + 1;

    while( leftPos <= leftEnd && rightPos <= rightEnd)
          if (a[leftPos].compareTo( a[rightPos] ) < 0 )
              tmpArray[tmpPos++] = a[leftPos++];
          else
              tmpArray[tmpPos++] = a[rightPos++];
    while ( leftPos <= leftEnd )
           tmpArray[tmpPos++] = a[leftPos++];
    while ( rightPos <= rightEnd )
           tmpArray[tmpPos++] = a[rightPos++];
    for( int i=0; i< numElements; i++, rightEnd --)
          a[rightEnd] = tmpArray[rightEnd];

}

运行时间是O(NlogN),但几乎不用它作为内存排序算法。问题在于归并两个有序数组需要额外内存,另外还有复制临时数组拷回原数组的额外操作。
分享到:
评论

相关推荐

    排序算法-java实现

    本篇文章将详细探讨Java中实现的排序算法及其改进。 1. **冒泡排序**(Bubble Sort):冒泡排序是最基础的排序算法,通过不断交换相邻的逆序元素来逐步完成排序。Java中虽然没有内置的冒泡排序函数,但开发者可以...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    在计算机科学中,排序算法是数据...归并排序和快速排序则在大多数情况下都能提供较高的效率,尤其是快速排序,是实际应用中非常常用的排序算法。了解并掌握这些排序算法,对于理解算法原理、提高编程能力具有重要意义。

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法

    Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...

    常用的排序算法(java实现),附带一个PPT动画演示、详解了其中三种

    除了插入排序和希尔排序,压缩包中还可能包含了其他几种常见的排序算法的Java实现,如冒泡排序、快速排序、选择排序、归并排序和堆排序等。每种排序算法都有其特定的适用场景和性能特点。例如,冒泡排序虽然简单,但...

    java实现的排序算法-8个

    Java作为一种广泛使用的编程语言,提供了丰富的工具和方法来实现各种排序算法。以下是基于给定的Java文件名(8种不同的排序算法)的详细说明: 1. **RadixSort.java** - 基数排序 基数排序是一种非比较型整数排序...

    八大排序-java实现版

    八大排序java实现版本,直接插入排序、折半插入排序、冒泡排序、简单选择排序、希尔插入排序、快速排序 、堆排序、2-路归并排序 、基数排序,并有时间比较,博文...

    常用排序算法分析与实现(Java版)

    ### 常用排序算法分析与实现(Java版) #### 插入排序 **1. 直接插入排序** 直接插入排序是一种简单的排序方法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并...

    常用排序算法实现(java)

    本资源提供了五种经典的排序算法的Java实现,包括选择排序(Selection Sort)、插入排序(Insertion Sort)、希尔排序(Shell Sort)、归并排序(Merge Sort)以及快速排序(Quick Sort)。 1. **选择排序**:选择排序是一种...

    8中排序算法(java实现)

    以下是关于标题"8种排序算法(Java实现)"及其描述中提到的排序算法的详细讲解: 1. **插入排序**: - **直接插入排序**:基本思想是从第二个元素开始,逐个与前面已排序的元素比较,找到合适的位置插入,保持已...

    常用排序算法源码下载(Java实现)

    常用排序算法的Java实现源码,包括冒泡排序,快速排序,直接插入排序,希尔排序,直接选择排序,堆排序,归并排序,基数排序,计数排序。

    八种排序算法原理及Java实现( 冒泡排序+快速排序直接插入排序+希尔排序+选择排序+归并排序+基数排序)

    八种排序算法原理及Java实现是排序算法中的一种,包括冒泡排序、快速排序、直接插入排序、希尔排序、选择排序、归并排序和基数排序等。 冒泡排序是八种排序算法中的一种,属于交换排序。冒泡排序的基本思想是重复...

    常用数据结构及其算法的Java实现

    八大排序算法及其实现,具体包括直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序,归并排序,基数排序在内的八种排序算法,同时对各种算法的基本特征做出了详细分析: - 算法基本思想 - 算法的...

    各种排序算法java实现

    在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...

    排序算法的Java实现

    Java作为一种广泛应用的编程语言,提供了丰富的工具来实现各种排序算法。以下将详细解释标题和描述中涉及的几种排序算法的Java实现。 1. **计数排序(RadixSort.java)** 计数排序是一种非基于比较的排序算法,适用...

    排序算法 - Axb的自我修养1

    除此之外,还有其他一些排序算法,如归并排序,它采用分治策略,将数组分割成两半,分别排序后再合并,保证了稳定性,时间复杂度为O(N log N)。 在实际应用中,应根据数据规模、数据分布以及内存限制等因素选择合适...

    八大排序算法总结(含Java实现源代码)

    这里我们将深入探讨八大排序算法,并结合Java语言来理解它们的实现原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换式排序算法。它通过重复遍历待排序的元素列表,比较相邻元素并根据需要交换它们,...

    排序算法_java

    本文将深入探讨标题和描述中提及的五种经典排序算法——插入排序、归并排序、选择排序、冒泡排序和希尔排序,以及它们在Java中的实现。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观的排序算法,它的工作...

    排序算法 -- 插入排序

    在实际应用中,插入排序通常用于小规模数据或者作为其他高级排序算法(如快速排序、归并排序)的基石,特别是在处理部分有序的数据时,它的表现往往优于其他O(n^2)的排序算法。同时,插入排序也可以用于构建更复杂的...

Global site tag (gtag.js) - Google Analytics