lintcode 整数排序 | 希尔排序算法(Java)

来源:互联网 发布:大数据需要掌握的技术 编辑:程序博客网 时间:2024/06/04 19:09

题目

给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。

样例

对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]。

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
详细讲解戳这里百度百科

代码

public class Solution {    /**     * @param A an integer array     * @return void     */    public void sortIntegers(int[] A) {        int d = A.length;        if (d <= 1) return;//过滤为空或者长度为1的数组        while (true){//一直循环直到增量为1            d = d/2;//每次增量缩小的比列,一般取一半,如果刚开始增量缩小的太小,容易造成超时,例如 d = d/5            for(int x=0; x<d; x++){//从第0个开始循环,循环一组,即到增量的大小                for (int i = x+d; i<A.length; i= i+d){//根据增量大小选出每组                    int temp = A[i];                    int j;                    //将每组的数据选中的那个和他前面的进行比较,如果前面的数字大则进行交换,注意这里是j>=0                    for (j = i-d; j>=0&&A[j]>temp; j = j-d){                        A[j+d] = A[j];                    }                    //因为每次j = j-d,所以循环后j要加d 才是要交换的那个                    A[j+d] = temp;                }            }            if (d == 1){                break;            }        }    }}

这里写图片描述

算法题目地址:http://www.lintcode.com/zh-cn/problem/sort-integers/

原创粉丝点击