排序的分类:

1.希尔排序

希尔排序是快速插入排序的改进版,希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

基本思路:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止,一般是选取d1为数组的一半,d2为d1的一半以此类推..

具体代码:

package Sort;

public class Shell_sort {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {78,68,48,39,95,48,94,73};
//希尔排序
int d=a.length;
while(d>1)
{
d=d/2;
for(int x=0;x<d;x++)
{//以d为公差分组,分成d个数组,每个数组为{a[i+d],a[i+2d],a[i+3d]....}
for(int i=x+d;i<a.length;i=i+d)
{//按直接插入排序将这些数组排序(具体方法查看我的直接插入排序http://www.cnblogs.com/pipixiao/p/7674142.html)
int temp=a[i];
int j;
for(j=i-d;j>=0&&a[j]>temp;j=j-d)
{
a[j+d]=a[j];
}
a[j+d]=temp;
}
}
}
System.out.println("排序之后:");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
}
}

运行结果:

2.堆排序

大根堆排序,小根堆排序。

大根堆排序:先构建二叉树(构建的二叉树必须满足父节点必须大于其左右子节点,数组中第一个数字为a【0】其左右子节点的应为a【1】,a【2】,以脚标定义既是父节点为a【i】,其左右子节点分别为a【2i+1】,a【2i+2】),再将二叉树中第一个数获取放入另外一个空数组中,剩下的数重新形成一个新的数组,再重新建堆,重复上述步骤,直到原数组中数字被取完,得到的新数组,既是一个由大到小排序完成的数组

由此二叉树可知2是5,6的父节点,将2,5,6三个位置的数比较大小,得到最大的数与2位置的交换,当得到的数就是2本身,不做交换,(1,3,4),(0,1,2)位置的数也应该做同样的步骤,这样最终0位置获得的数既是最大的数,然后将得到的数组中a【0】拿出,后面的数构建新数组,重新再构建树。重复上述步骤

注意:这里可以看出构建数循环的次数为3次即:for(int i=(a.lenght-1)/2-1,i>=0,i--);但是当出现下面这种情况时很显然这个条件不满足,下面循环的次数为4次,我们可以不改变上述循环的原理上面加一点既:for(int i=(a.lenght-1)/2-1+(a.lenght-1)%2;i>=0;i--)其实对比不难看出当数组的长度为偶数的时候,得到的二叉树最后悔单出来一个位置,这里面比较的条件就会发生变化,而(a.lenght-1)%2可以得到长度为偶数则加一次循环,为奇数时不变。

构建的数是这种情况的时候(3,7)位置的数比较的时候只有两个数比较,所以这里出现了一个不同,就应该加一个判断条件(本次比较是否存在a【2i+2】这一项,如果不存在则比较的数只有a【i】与a【2i+1】)

具体代码:

package Sort;

import java.util.Arrays;

public class HeapSort {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {78,68,48,39,95,48,94,73};
int[] a = new int[8];
for(int i=0;i<a.length;i++){
heap(arr);
a[i]=arr[0];//将当前数组第一个数获取给数组a
arr=Arrays.copyOfRange(arr,1,arr.length);//截取取arr数组的第一个数后面的所有数,重新给arr
}
for (int m = 0; m < a.length; m++) {//遍历输出数组a,数组a既是排序完成后的数组
System.out.print(a[m]+" ");
}
}
public static void heap(int[] arr){//创建堆
int temp=0;
for(int j=(arr.length-1)/2-1+(arr.length-1)%2;j>=0;j--){//获取每次创建堆的循环条件
if(2*j+2<=arr.length-1){//判断当前a[2*j+2]是否存在,存在则执行a[j]、a[2*j+1]、a[2*j+2]比较,不存在则执行a[j]、a[2*j+1]比较
temp=arr[j]>arr[2*j+1]?(arr[j]>arr[2*j+2]?j:2*j+2):(arr[2*j+1]>arr[2*j+2]?2*j+1:2*j+2);//比较获得最大数的脚标
}else{
temp=arr[j]>arr[2*j+1]?j:2*j+1;
}
if(arr[j]==arr[temp]){//如果最大的数就是a[j]本身则退出进行下一次比较
continue;
}else{//最大数不是a[j]则最大数与a[j]交换位置
arr[j]=arr[j]^arr[temp];
arr[temp]=arr[j]^arr[temp];
arr[j]=arr[j]^arr[temp];
}
}
} }

运行结果:

【知了堂学习笔记】java 编写几种常见排序算法3的更多相关文章

  1. 【知了堂学习笔记】java 编写几种常见排序算法

    排序的分类: 一.交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 1.冒泡 ...

  2. 【知了堂学习笔记】java 编写几种常见排序算法2

    排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...

  3. [知了堂学习笔记]_ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  4. Java中几种常见排序算法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数 ...

  5. Java的几种常见排序算法

    一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...

  6. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  7. 【知了堂学习笔记】java 自定义异常

    java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...

  8. 【知了堂学习笔记】java 接口与抽象类

    本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题 ...

  9. 【知了堂学习笔记】java 底层容易忽略的知识点

    1. java中的关键字 提到关键字,最主要的就是不能用关键字作为标识符,值得注意的有以下几点. ①其中goto与const在java中没有定义,但是也是关键字.这个基本用不到,但是应该有个认知. ② ...

随机推荐

  1. [整理]C语言中字符常量与ASCII码

    所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...

  2. ASP.NET项目与IE10、IE11不兼容的解决办法

    1.解决办法 机器级别修复, 服务器所有ASP.NET程序受益 需要去微软下载对应asp.NET版本的修补程序 .NET 4 -http://support.microsoft.com/kb/2600 ...

  3. Spring Boot 集成 MyBatis和 SQL Server实践

    概 述 Spring Boot工程集成 MyBatis来实现 MySQL访问的示例我们见过很多,而最近用到了微软的 SQL Server数据库,于是本文则给出一个完整的 Spring Boot + M ...

  4. HDU 2094 产生冠军 dfs加map容器

    解题报告:有一群人在打乒乓球比赛,需要在这一群人里面选出一个冠军,现在规定,若a赢了b,b又赢了c那么如果a与c没有比赛的话,就默认a赢了c,而如果c赢了a的话,则这三个人里面选不出冠军,还有就是如果 ...

  5. 如何清理休眠文件(hiberfil.sys)

    如果使用了休眠功能,那么打开系统盘就会有一个很大(5.36G)的hiberfil.sys文件,它是将用户正在运行的程序,保存在这里,再启动系统就很快了.如要清理它(不用休眠功能,或者临时腾出空间),可 ...

  6. 关于Unix/Linux的终端、伪终端、控制台和shell

    历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...

  7. TCP报文的最大负载和报文的最小长度

    TCP报文的最大负载和报文的最小长度 MTU:最大传输单元,以太网的MTU为1500Bytes MSS:最大分解大小,为每次TCP数据包每次传输的最大数据的分段大小,由发送端通知接收端,发送大于MTU ...

  8. mysql 在windons下的备份命令

    1. @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" mysqldump -uroot -proot jy510 > ...

  9. ProtocolBuffer 使用及 一些坑

    Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. ProtocolBuffer的优势 跨平台: Prot ...

  10. APUE-文件和目录(二)函数access,mask,chmod和粘着位

    4.7 函数access和faccessat 当一个进程使用了设置用户ID和设置组ID作为另一个用户(或者组)运行时,这时候有效用户(组)ID和实际用户(组)ID不一样,但进程仍然希望测试实际用户(组 ...