希尔排序JAVA实现

package kpp.sort;
/**
 * 希尔排序
 * 1.设定步长d,每隔d个元素分为一组,组内插入排序;
 * 2.d/=2,重复1步骤,直到步长为1
 *
 * 们知道一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

  希尔排序的时间性能优于直接插入排序,原因如下:
  (1)当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
  (2)当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
  (3)在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
  因此,希尔排序在效率上较直接插人排序有较大的改进。
  希尔排序的平均时间复杂度为O(nlogn)。

 * @author kpp
 *
 */
public class ShellSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int array[] = {49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
        shellSort(array);
        for(int k :array){
            System.out.println(k);
        }
    }
    private static int shellSort(int data[]){
        int len = data.length;

        int temp = 0;
        for (int increment = len / 2; increment > 0; increment /= 2) {
            int j = 0;
            for (int i = increment; i < len; i++) {
                temp = data[i];
                for (j = i-increment; j >= 0; j -= increment) {
                    if(temp < data[j]){
                        data[j+increment] = data[j];
                    }else{
                        break;
                    }
                }
                data[j+increment] = temp;
            }
        }
        return 0;
    }
}
时间: 2024-12-19 19:12:14

希尔排序JAVA实现的相关文章

希尔排序及希尔排序java代码

原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序按照此规律直到全部参与了排序.然后将间隔约定为4-1=3,然后继续进行如上的排序方法.具体过程如下: 9 1 2 3 0 4 5 7 6 8 Setp 1 经过间隔为4排序后变成 : 0 1 2 3 6 4 5 7 9 8 Setp 2 经过间隔为3排序后变成 : 0 1 2 3 6 4 5 7 9

希尔排序(java)

时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++",12),("c",76),("java",44)}scala和c++的值相等,排序前scala在c++的前面 如果排序后 {("scala",12),("c++",12),("python",34

希尔排序java

希尔排序简述 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率.(希尔排序先将部分数据进行排序,相当于已经部分排好序) 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位.(希尔排序先将间隔大的数据进行大的移位,后期的移位距离相对要小很多) 分析: 先去一个小于n的整数的H作为第一个增量,把文件的全部记录分组.即将所有距离为H的倍数的记录放在同一个族中,先在各组内进行直接插入排序:然后去第二个增量重复上述

插入排序与希尔排序Java实现

public class TestMain { public static void main(String[] args) { Integer[] a = new Integer[5000]; for (int i = 0; i < a.length; i++) { int temp = (int)(StdRandom.random()*10000); a[i] = temp; } Integer[] b = new Integer[5000]; for (int i = 0; i < b.

希尔排序JAVA代码

package 备份类; public class 希尔直插排序 { public static void main(String[] args) { int[] a = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 10 }; print(a); shellSort(a); print(a); } public static void shellSort(int[] a) { int d = 3;// 增量 int gap = 1;// 间距 // 计算出最大的

java希尔排序算法

原文:java希尔排序算法 代码下载地址:http://www.zuidaima.com/share/1550463279090688.htm 希尔排序算法的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止.该方法实质上是一种

【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)

插入排序基本思想 每次将一个待排序的记录按其关键字大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完成为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的有序表.即假设待排序的记录存放在数组R[1······n]中,排序过程中,R被分成两个子区间R[1······i]和R[i+1······n],其中,R[1······i]是已经排好序的有序区:R[i+1······n]是当前未排序的部分.将当前无序区的第一个记录R[i+1]插

Java排序算法(四):希尔排序

[基本思想] 将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样可以称为基本有序了. [java实现] public class ShellSort { public static void main(String

算法-java代码实现希尔排序

希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class ShellSort { 4 public int[] shellSort(int[] A, int n) { 5 int