用JAVA写的插入排序
2016-02-20 14:12
525 查看
public class ShellSort {
public static void shell(int []s,int l){ //希尔排序
int n=l+1,i,j;
// System.out.println(n+"=======");
for(l=l/2;l>=1;l=l/2){ //设置每次组距,直到组距为1时说明已经排序好
// System.out.println(l+"=======");
for( i=l+1;i<n;++i)//每个元素相差组距距离的直接插入排序例如 数组a[]={0,4,3,2,1}; 当L=2时a[1],a[3]位一组进行插入排序
if(s[i]<s[i-l]){
s[0]=s[i];
for( j=i-l;j>0&&s[0]<s[j];j-=l) //进行移位
{ s[j+l]=s[j];
// System.out.println("j的值:"+j);
for(int a=0;a<5;a++){
// System.out.print(s[a]+"***");
}
// System.out.println();
}//
// System.out.println("j最后值"+j);
s[j+l]=s[0];//最后经值赋给空出来的位置
}//if
}
// return s;
}
public static void insertSort(int []s,int l ){ //直接插入排序s[0]不存放数据
int i,j;
for(i=2;i<=l;i++){ //依次将s[2]~s
插入前面已排序序列
if(s[i]<s[i-1]){
s[0]=s[i]; //复制为哨兵
for(j=i-1;s[0]<s[j];--j) //向后移位
s[j+1]=s[j];
s[j+1]=s[j];
}//if
}
}
public static void insertSortM(int []s,int l){//折半插入排序 思想:利用折半查找的原理先找到要插入的
//位置 ,再进行移动
int i,j,mid,low,high;
for(i=2;i<=l;i++){
if(s[i]<s[i-1]){
s[0]=s[i];
low =1;high=i-1;
while(low<=high){
mid=(low+high)/2;
if(s[0]>s[mid])
low=mid+1;
else
high=mid-1;
}//while
for(j=i-1;j>=high+1;j--)
s[j+1]=s[j];
s[high+1]=s[0];
}//if
}//for
}
public static void main(String[] args) {
int a[]={0,4,3,2,1};
int b[]={0,4,3,2,1};
int c[]={0,4,3,2,1};
shell(a,4);
//************************************************
System.out.println("希尔排序\n");
shell(a,4);
for(int i=0;i<5;i++){
System.out.print(a[i]+"***");
}
System.out.println();
//************************************************
System.out.println("折半插入排序\n");
insertSortM(b,4);
for(int i=0;i<5;i++){
System.out.print(b[i]+"***");
}
System.out.println();
//************************************************
System.out.println("直接插入排序\n");
insertSort(c,4);
for(int i=0;i<5;i++){
System.out.print(c[i]+"***");
}
}
}
public static void shell(int []s,int l){ //希尔排序
int n=l+1,i,j;
// System.out.println(n+"=======");
for(l=l/2;l>=1;l=l/2){ //设置每次组距,直到组距为1时说明已经排序好
// System.out.println(l+"=======");
for( i=l+1;i<n;++i)//每个元素相差组距距离的直接插入排序例如 数组a[]={0,4,3,2,1}; 当L=2时a[1],a[3]位一组进行插入排序
if(s[i]<s[i-l]){
s[0]=s[i];
for( j=i-l;j>0&&s[0]<s[j];j-=l) //进行移位
{ s[j+l]=s[j];
// System.out.println("j的值:"+j);
for(int a=0;a<5;a++){
// System.out.print(s[a]+"***");
}
// System.out.println();
}//
// System.out.println("j最后值"+j);
s[j+l]=s[0];//最后经值赋给空出来的位置
}//if
}
// return s;
}
public static void insertSort(int []s,int l ){ //直接插入排序s[0]不存放数据
int i,j;
for(i=2;i<=l;i++){ //依次将s[2]~s
插入前面已排序序列
if(s[i]<s[i-1]){
s[0]=s[i]; //复制为哨兵
for(j=i-1;s[0]<s[j];--j) //向后移位
s[j+1]=s[j];
s[j+1]=s[j];
}//if
}
}
public static void insertSortM(int []s,int l){//折半插入排序 思想:利用折半查找的原理先找到要插入的
//位置 ,再进行移动
int i,j,mid,low,high;
for(i=2;i<=l;i++){
if(s[i]<s[i-1]){
s[0]=s[i];
low =1;high=i-1;
while(low<=high){
mid=(low+high)/2;
if(s[0]>s[mid])
low=mid+1;
else
high=mid-1;
}//while
for(j=i-1;j>=high+1;j--)
s[j+1]=s[j];
s[high+1]=s[0];
}//if
}//for
}
public static void main(String[] args) {
int a[]={0,4,3,2,1};
int b[]={0,4,3,2,1};
int c[]={0,4,3,2,1};
shell(a,4);
//************************************************
System.out.println("希尔排序\n");
shell(a,4);
for(int i=0;i<5;i++){
System.out.print(a[i]+"***");
}
System.out.println();
//************************************************
System.out.println("折半插入排序\n");
insertSortM(b,4);
for(int i=0;i<5;i++){
System.out.print(b[i]+"***");
}
System.out.println();
//************************************************
System.out.println("直接插入排序\n");
insertSort(c,4);
for(int i=0;i<5;i++){
System.out.print(c[i]+"***");
}
}
}
相关文章推荐
- String类型
- windows下,用eclipse连接虚拟机中的hadoop
- Java并发读取List2
- springMVC搭建
- JAVA集合类总结
- SpringMVC项目使用Thymeleaf模板引擎
- 浅析Java内存分配机制
- JAVA super() this() 详解
- Java学习笔记2016.2.20 访问修饰符、包
- Java測试覆盖率工具----Cobertura,EclEmma
- 命令行运行程序 解决 java “错误:编码GBK 的不可映射字符”
- Java多线程的通信2
- Spring+SpringMVC项目搭建
- JAVA多线程-线程间通信(一)-等待/通知机制(wait/notify)
- Java多线程的通信1
- MyEclipse安装后需要进行的配置
- MyEclipse安装后需要进行的配置
- Java初学之IO(二)
- Java的内存机制
- 抽象类可以继承实体类吗?