【java学习】排序_Shell排序

来源:互联网 发布:巴纳姆效应 知乎 编辑:程序博客网 时间:2024/05/21 09:35

排序思想
shell排序是基于插入排序的一种改进,它先将待排序数组分成几份然后对各部分数组进行插入排序,然后继续对数组进行细分并排序,最后对整个数组进行插入排序,这样做的目的是为了在最后进行的对整个数组进行排序的时候,保证此时的数组尽可能有序,那么需要让元素交换位置的操作会少很多。
这个算法的时间复杂度是O(nlog(n))
代码

package shell;import java.util.Arrays;// shell排序public class ShellDemo {    public static int arr[] = { 23, 5, 37, 43, 56, 28, 91, 34, 213 };    public static void main(String[] args) {        System.out.println(Arrays.toString(arr) + "first");        // 执行希尔排序算法        shellSort(arr.length - 1);        System.out.println(Arrays.toString(arr) + "last");    }    private static void shellSort(int index) {        // TODO Auto-generated method stub        boolean change = false;         // 数据是否改变        int dataLength = index / 2;     // 分割集合间的间隔        int pointer = 0;                // 进行处理的位置        while (dataLength != 0) {            // 对各个集合进行处理            for (int i = dataLength; i < index; i++) {                change = false;                pointer = i - dataLength;                // 进行集合间的元素比较和交换                while (arr[pointer + dataLength] < arr[pointer] && pointer >= 0 && pointer <= index) {                    // 交换                    int temp = arr[pointer];                    arr[pointer] = arr[pointer + dataLength];                    arr[pointer + dataLength] = temp;                    // 计算下一个要进行处理的位置                    pointer = pointer - dataLength;                    change = true;                    if (pointer < 0 || pointer > index)                        break;                }                // 与最后的数值交换                if (change) {                    System.out.println(Arrays.toString(arr) + "current=" + i);                }            }            dataLength = dataLength / 2;        }    }}
0 0