Java代码 希尔排序
2015-05-30 16:01
459 查看
每天都更,最近再研究算法,希望能够把算法搞明白
先将整个待排序列分割成若干子序列,然后依次根据缩减增量进行排序
如下举例:
n=12; 15 26 5 39 19 38 10 3 58 78 9 98
第一次 gap=12/2=6
15 26 5 39 19 38 10 3 58 78 9 98
1A 2A 3A 4A 5A 6A 1B 2B 3B 4B 5B 6B
分成了六组分别是(15,10)(26,3)(5,58)(39,78)(19,9)(38,98)
第二次 gap=6/2=3
15 26 5 39 19 38 10 3 58 78 9 98
排完序之后为:
10 3 5 39 9 38 15 26 58 78 19 98
1A 2A 3A 1B 2B 3B 1C 2C 3C 1D 2D 3D
分成3组分别是(10,39,15,78)(3,9,26,19)(5,38,58,98)
第三次 gap=3/2=1
排序完成后
10 3 5 15 9 38 39 19 58 78 26 98
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L
分成一组
再进行一次插入排序即可 因为在元素基本有序的情况下 插入排序的效率高
完成排序之后
3 5 9 10 15 19 26 38 39 58 78 98
Java代码如下
希尔排序的思想
其实就是分组的插入排序先将整个待排序列分割成若干子序列,然后依次根据缩减增量进行排序
如下举例:
n=12; 15 26 5 39 19 38 10 3 58 78 9 98
第一次 gap=12/2=6
15 26 5 39 19 38 10 3 58 78 9 98
1A 2A 3A 4A 5A 6A 1B 2B 3B 4B 5B 6B
分成了六组分别是(15,10)(26,3)(5,58)(39,78)(19,9)(38,98)
第二次 gap=6/2=3
15 26 5 39 19 38 10 3 58 78 9 98
排完序之后为:
10 3 5 39 9 38 15 26 58 78 19 98
1A 2A 3A 1B 2B 3B 1C 2C 3C 1D 2D 3D
分成3组分别是(10,39,15,78)(3,9,26,19)(5,38,58,98)
第三次 gap=3/2=1
排序完成后
10 3 5 15 9 38 39 19 58 78 26 98
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L
分成一组
再进行一次插入排序即可 因为在元素基本有序的情况下 插入排序的效率高
完成排序之后
3 5 9 10 15 19 26 38 39 58 78 98
Java代码如下
package sort; //希尔排序 //2015-05-30 public class ShellSort { //第一种方式 希尔排序完全按照定义来写 // public void ShellSort1(int a[],int n){ // int i,j,gap; // for(gap=n/2;gap>0;gap/=2){ // for(i=0;i<gap;i++){ // for(j=i+gap;j<n;j+=gap){ // if(a[j]<a[j-gap]){ // int temp=a[j]; // int k; // for( k=j-gap;k>=0&&a[k]>temp;k-=gap){ // a[k+gap]=a[k]; // } // a[k+gap]=temp; // } // } // } // } // } //第二种方式 希尔排序代码优化,每次都从数组的第gap个元素开始进行插入排序 // public void ShellSort2(int a[],int n){ // int j,gap; // for(gap=n/2;gap>0;gap/=2){ // for(j=gap;j<n;j++){ // if(a[j]<a[j-gap]){ // int temp=a[j]; // int k=j-gap; // while(k>=0&&a[k]>temp){ // a[k+gap]=a[k]; // k-=gap; // } // a[k+gap]=temp; // } // } // } // } //第三种方式 插入排序简化一下 public void ShellSort3(int a[],int n){ int i,j,gap; for(gap=n/2;gap>0;gap/=2){ for(i=gap;i<n;i++){ for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap){ swap(a,j,j+gap); } } } } //交换方法 public void swap(int a[],int p,int q ){ int k; k=a[p]; a[p]=a[q]; a[q]=k; } }
相关文章推荐
- java使用归并删除法删除二叉树中节点的方法
- mybatis与spring的整合(使用接口实现crud)
- Struts2框架提供的结果类型
- Java获得指定区间数的方法
- java-导出excel并解决乱码问题
- Java开发环境配置
- java 基础学习-04 线程学习案例
- java中的异常详解
- <tx:method/> 有关的设置
- Java套接字socket的使用
- 《Java虚拟机原理图解》 1.1、class文件基本组织结构
- struts2漏洞攻击一例
- struts2漏洞攻击方法与解决方案
- JAVA中接口存在的意义
- spring下配置dbcp,c3p0,proxool
- Java 调用存储过程
- struts2学生信息管理系统篇章②进度报告篇章
- java初学者总结(2)
- 解决struts2在(IE,Firefox)下载文件名乱码问题
- Struts2 注解中跳转 action