插入排序(直接插入排序与希尔排序)

插入排序:
假设一数组data【】
直接插入排序原理:
从第二个元素data[1]开始,向前遍历,比较前面的元素值与data[1]的大小,如果data[1]大于前面元素,就将元素位置放入data[0]位置。依次类推,直到最后一个元素。空间复杂度为o(1);时间复杂度为o(n*2/2).
希尔排序:
直接排序移动的距离可能太长了,所以为了这个进行了改进。
Shell步骤:1定义一个h=1,比较h

package Sort;

import java.util.Scanner;

public class InsertionSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext())
        {
            int n=sc.nextInt();
            int[] data=new int[n];
            for(int i=0;i<n;i++)
            {
            data[i]=sc.nextInt();
            }
            insertionsort(data);
        }
        sc.close();

    }
   public static void insertionsort(int[] data)
   {

       for(int index=1;index<data.length;index++){
               int key=data[index];
               int position=index;
         while(position>0 &&data[position-1]>key)
         {
             //元素后移
            data[position]=data[position-1];
            position--;
         }
//       元素前移
        data[position]=key;
       }
       for(int a=0;a<data.length;a++)
       {
           System.out.print(data[a]);
       }

   }

}
package Sort;

import java.util.Scanner;

//希尔排序
//1第一步首先对数组进行划分从数组长度的3分之一开始
//2第二进行插入排序
//3对比较值再次进行排序只不过这次的h是原来长度的三份之一
public class ShellSort {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext())
        {
            int n=sc.nextInt();
            int[] data=new int[n];
            for(int i=0;i<n;i++)
            {
            data[i]=sc.nextInt();
            }
            ShellSort(data);
        }
        sc.close();

    }

    public static void ShellSort(int[] data)
    {

        //第一步,定义h
        int h=1;
        while(h<data.length/3)
        {
            //定义一个h
            h=h*3+1;
        }
        //进行插入排序
        while(h>0){
        for(int i=h;i<data.length;i++)
        {
            int position=i;
            int key=data[position];
            //这里的position大于0可以,但是一般都使用大于h-1

            while(position>h-1 && data[position-h]>key)
            {
                //元素后移
                data[position]=data[position-h];
                position-=h;
            }
            data[position]=key;

        }
        //减小间隔
            h=(h-1)/3;
        }
          for(int a=0;a<data.length;a++)
           {
               System.out.print(data[a]);
           }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值