插入排序:
假设一数组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]);
}
}
}