Shell排序算法和合并排序算法
Shell排序(希尔排序)算法
Shell排序严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序。
Shell排序的流程:
1.将由n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对,......
2.一次循环使每个序列对排序好顺序
3.然后,再变为n/4个序列,再次排序。
4.不断重复上述过程,随着序列减少最后为一个,也就完成整个排序
/**
* Shell排序(希尔排序)
* @author Red Ants(guangboyuan.cn)
* 微信公众号:程序员之路 堆排序
*/
public class ShellSort { public static void shellSort(int[] a) {
int x = 0;
for (int r = a.length / 2; r >= 1; r /= 2) {//分解数组元素为多个序列,每次比较两数的间距,直到其值为0就结束循环
for(int i = r;i<a.length;i++){//按设置的间距r,分别比较对应的数组元素。在该循环中使用插入排序法对指定间距的元素进行排序
int temp = a[i];
int j = i-r;
while (j>=0 && temp <a[j]) {
a[j+r] = a[j];
j-=r;
}
a[j+r] = temp;
}
x++;
System.out.println("第"+x+"步排序结构:"+Arrays.toString(a));
}
} public static void main(String[] args) {
int[] nums = new int[]{3,22,77,8,12,54,11,15,2};
System.out.println("排序前:"+Arrays.toString(nums));
shellSort(nums);
System.out.println("排序后:"+Arrays.toString(nums));
}
}
合并排序算法
是用分治策略实现对N个元素进行排序的算法。其基本思想是:
将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
重点:
1.分治的实现
2.合并的实现
分治,就是把整个集合的元素一直除2化分,一直化为到没有两个元素开始合并。
/**
* 合并排序
* @author Red Ants(guangboyuan.cn)
* 微信公众号:程序员之路 堆排序
*/
public class MergeSort { public static void main(String[] args) {
MergeSort m = new MergeSort();
int a[] = { 5, 4, 10, 8, 7, 9, 11 };
System.out.println("排序前:"+Arrays.toString(a));
m.mergeSort(a, 0, a.length - 1);
System.out.println("排序后:"+Arrays.toString(a));
} public void mergeSort(int[] arrays, int start, int end) {//递归算法
if (start < end) {//出口
int m = (start + end) / 2;
mergeSort(arrays, start, m);
mergeSort(arrays, m + 1, end);
combin_arrays(arrays, start, m, end);
}
} // 合并数组
public void combin_arrays(int[] arrays, int start, int m, int end) {
int length = end - start + 1;
int temp[] = new int[length];// 用来存放比较的数组,用完复制回到原来的数组
int i = start;
int j = m + 1;
int c = 0;
while (i <= m && j <= end) {
if (arrays[i] < arrays[j]) {
temp[c] = arrays[i];
i++;
c++;
} else {
temp[c] = arrays[j];
j++;
c++;
}
}
while (i <= m) {
temp[c] = arrays[i];
i++;
c++;
}
while (j <= end) {
temp[c] = arrays[j];
j++;
c++;
}
c = 0;
for (int t = start; t <= end; t++, c++) {
arrays[t] = temp[c];
}
System.out.println(Arrays.toString(arrays));
}
}
Shell排序算法和合并排序算法的更多相关文章
- 算法:合并排序(Merge Sort)
算法定义 合并排序是一种递归算法,思路如下: 如果源数组长度为 1,立即返回. 将源数组平分为两个新数组:Left 和 Right. 对 Left 执行递归排序. 对 Right 执行递归排序. 将排 ...
- 算法之合并排序(mergeSort)
合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解. 合并排序的模式一般如下: 1.分 ...
- python 实现排序算法(二)-合并排序(递归法)
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Nov 21 22:28:09 201 ...
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- 算法笔记_014:合并排序(Java)
1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- 数据结构与算法之--高级排序:shell排序和快速排序
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- C语言归并排序(合并排序)算法及代码
归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并.仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]…, A ...
随机推荐
- mysql 数据操作 单表查询 group by group_concat() 函数
# group_concat() 和concat() 一样拼接字符串 用在分组里 需求:查看每个职位都有哪些员工名字 把所有员工成员的名字都列出来 把每个职位里的员工姓名列出来 mysql> s ...
- 初识MVCSharp
MVCSharp其实是MVP模式 主要内容 ITask IView IController
- [py]数据描述符优先级
实例查找属性的顺序: 类属性 > 数据描述符 > 实例属性 > 非数据描述符 > __getattr__ 类属性>数据描述符>实例属性 class Str: def ...
- C#判断用户是手机访问还是PC访问
今天在做一个wap网站时,需要限制PC用户访问.网上找了很多资料,效果都不怎么理想.其实原理就是根据HTTP_USER_AGENT判断检查用户在用什么浏览器,再根据业务做相应的逻辑处理. 代码如下: ...
- GBDT XGBOOST的区别与联系
Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear). 传统GBDT以CART作为基分类器,xgboost还支持线性分 ...
- (转)WPF学习资源整理
由于笔者正在学习WPF,所以整理出网络中部分WPF的学习资源,希望对同样在学习WPF的朋友们有所帮助. 首推刘铁猛的<深入浅出WPF>系列博文 1.深入浅出WPF(1)——什么是WPFht ...
- OAuth 白话简明教程 4.刷新 Access Token
转自:http://www.cftea.com/c/2016/11/6705.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...
- JS在if中的强制类型转换
JS在if中的强制类型转换 众所周知,JS在很多情况下会进行强制类型转换,其中,最常见两种是: 1.使用非严格相等进行比较,对==左边的值进行类型转换 2.在if判断时,括号内的值进行类型转换,转化为 ...
- Xilinx Uboot网卡驱动分析
1.MAC控制器.网卡.PHY.MDIO.mii.gmii.rgmii概念扫盲 网卡在功能上包含OSI模型的两个层,数据链路层和物理层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准 ...
- POJ 3159 Candies(差分约束+最短路)题解
题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa ...