shell排序的java实现

package com.edu.hpu.sort.insert.shell;

import java.util.Arrays;

import com.edu.hpu.sort.Sort;

public class ShellSort extends Sort {

    @Override
    public int[] doSort(int[] arr) {
        int len = arr.length;
        // 所有的步长可能性(首次为数组长的一半,接下来每次为上一次的一半)
        for (int gap = len / 2; gap > 0; gap /= 2) {
            // 将步长中的所有元素进行插入排序
            for(int w = 0; w < gap; w++){
                // 步长为gap的插入排序
                // 对照插入排序
                /*
                 * for(int i = p + 1; i < r; i++){
                 *        int key = arr[i];
                 *        int j = i - 1;
                 *        while(j >= 0 && arr[j] > key) {
                 *            arr[j + 1] = arr[j];
                 *            j--;
                 *        }
                 *        arr[j + 1] = key;
                 *    }
                 */
                for (int i = gap + w; i < len; i += gap) {
                    // 插入排序
                    int key = arr[i];
                    int j = i - gap;
                    while (j >= 0 && arr[j] > key) {
                        arr[j + gap] = arr[j];
                        j -= gap;
                    }
                    arr[j + gap] = key;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
        return arr;
    }

    public static void main(String[] args) {
        Sort sort = new ShellSort();
        sort.printOrder(new int[] {100, 201, 999, 4, 1, 3, 2, 16, 9, 100, 194, 8, 7, 0, 90 });
    }
}
时间: 2024-11-11 11:24:10

shell排序的java实现的相关文章

Java常见排序算法之Shell排序

在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let‘s go~~~ 1.排序算法的基本概念的讲解 时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数. 空间复杂度:分析需要多少辅助的内存. 稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的. 否则我们称这个排序算法是不稳定的

Java排序算法(四):Shell排序

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

Shell排序(希尔)算法--java

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<:…<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 该方法实质上是一种分组插入方法. 原理图: 源代码 1 package com.zc.manythread; 2 /** 3 * 4 * @author 偶my耶 5 * 6 */ 7

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

八大排序算法Java(转)

目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

HBASE之shell操作和Java访问

对数据库HBASE的操作有shell端和java API两种方式. 在此之前要先说一下HBASE的结构及其数据存储结构: HBASE是基于HDFS的,是一种NoSQL的数据库.它的数据模型如下所示: Row Key Timestamp Column Family URI Parser r1 t3 url=http://www.taobao.com title=天天特价 t2 host=taobao.com   t1     r2 t5 url=http://www.alibaba.com con

算法之排序算法-shell排序(移位法)

个人觉得移位法就是借希尔排序进行分组,插入排序进行排序 注释是上一篇的交换法. 而且这种排序的真的很快 package com.ebiz.sort; import java.text.SimpleDateFormat; import java.util.Date; /** * @author YHj * @create 2019-07-30 8:53 * shell排序-交换法 */ public class Shell{ public static void main(String[] arg

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的