高效排序算法(希尔排序)
2016-05-17 17:21
351 查看
static void shellSort(int[] data){
int sizeOfSeq=0; //分割的次数,即由步长所构成序列的长度,由以下动态求出
for(int h=1;h<data.length;h=3*h+1)
sizeOfSeq++;
int[] seq=new int[sizeOfSeq]; //步长数组,遵循seq[i+1]=3*seq[i]+1,经验最优序列
for(int i=0,h=1;i<seq.length;i++){
seq[i]=h;
h=3*h+1;
}
for(int i=seq.length-1;i>=0;i--){ //针对不同的步长
int step=seq[i];
for(int hCnt=0;hCnt<step;hCnt++){ //每个步长共需<步长>次
for(int j=hCnt+step,k;j<data.length;){ //针对每个步长的每一项,采用插入排序
int tmp=data[j];
k=j;
while(k-step>=0&&tmp<data[k-step]){
data[k]=data[k-step];
k-=step;
}
data[k]=tmp;
j+=step;
}
}
}
}
int sizeOfSeq=0; //分割的次数,即由步长所构成序列的长度,由以下动态求出
for(int h=1;h<data.length;h=3*h+1)
sizeOfSeq++;
int[] seq=new int[sizeOfSeq]; //步长数组,遵循seq[i+1]=3*seq[i]+1,经验最优序列
for(int i=0,h=1;i<seq.length;i++){
seq[i]=h;
h=3*h+1;
}
for(int i=seq.length-1;i>=0;i--){ //针对不同的步长
int step=seq[i];
for(int hCnt=0;hCnt<step;hCnt++){ //每个步长共需<步长>次
for(int j=hCnt+step,k;j<data.length;){ //针对每个步长的每一项,采用插入排序
int tmp=data[j];
k=j;
while(k-step>=0&&tmp<data[k-step]){
data[k]=data[k-step];
k-=step;
}
data[k]=tmp;
j+=step;
}
}
}
}
相关文章推荐
- 高效排序算法(快排序)
- 零编程开发管理软件,提高效率,缩短开发周期
- php+nginx搭建
- 朴素贝叶斯分类
- Android Studio项目结构&AS构建基础
- Json Web Token身份认证
- 【数据库】基础知识总结
- Codeforces Round #353 (Div. 2)题解
- 【转】SIFT特征提取分析
- [转]如何成为主管
- mate 8、荣耀6,手机连接eclipse、AS调试应用没有log输出
- JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
- AndroidTV桌面BriskTVLanucher
- 二叉查找树(AVL)插入算法Java实现
- Android中进程和线程
- 一个简单的递归算法的思考
- hibernate相关问题
- 可能最有效的母亲节邮件主题,你用对了吗?
- Hive实战
- 流氓网站5599.net修改ie主页分析