希尔排序(Java实现)——从控制台输入动态数据,排序后输出

希尔排序

排序思想

  • 希尔排序的思想特别像在插入排序基础上得到了改进,希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。因此,我们要采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。希尔排序是对直接插入排序算法的优化和升级。

  • 实现方式:在插入排序的基础上,套上一个步进的循环

实现代码

  1. 实现代码(之Main.java文件)
package Shell;

import java.util.ArrayList;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("please input the data,press \"CTRL+Z\" to end input");
        ArrayList<Integer> a = new ArrayList<Integer>();
        while(sc.hasNext()){
                int temp; 
                temp= sc.nextInt();
                a.add(temp);
            }
        new Functions().showAll(a);
        new Functions().shellSort(a);
        new Functions().showAll(a);
    }

}

2.实现代码(Functions.java)

package Shell;

import java.util.ArrayList;
import java.util.Iterator;

public class Functions {
    void shellSort(ArrayList<Integer> a){
        for(int r=a.size()/2;r>=1;r/=2){
            int j;
            for(int i=r;i<a.size();i+=r){
                j=i-r;
                int temp = a.get(i);
                while(j>=0&&temp<a.get(j)){
                    a.set((j+r), a.get(j));
                    j-=r;
                }
                a.set((j+r), temp);

            }
        }
    }

    public void showAll(ArrayList<Integer> a){
        System.out.println("please show the data");
        Iterator<Integer> it = a.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+"\t");
        }
        System.out.println();
    }
}

代码运行结果

这里写图片描述

其他和其他方式对比

这里写图片描述

猜你喜欢

转载自blog.csdn.net/siying8419/article/details/79733315
今日推荐