排序的分类:

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. spring boot使用自定义配置的线程池执行Async异步任务

    一.增加配置属性类 package com.chhliu.springboot.async.configuration; import org.springframework.boot.context ...

  2. 图片src拼接后台返回ID

    本文地址:http://www.cnblogs.com/veinyin/p/8507403.html  在学习 CSS 时只了解了给固定地址,但是如果给的是一个需要拼接的地址就蒙了,以下是基于 Vue ...

  3. hive笔记之row_number、rank、dense_rank

    hive中有三个与分组排序相关的分析函数(我起初也认为是窗口函数,后来看到手册里是把他们划到了Analytics functions下),row_number.rank.dense_rank,我一直傻 ...

  4. bootstrap_bootstrap中日历范围选择插件daterangepicker的使用

    1.引入脚本 <link rel="stylesheet" type="text/css" href="assets/css/bootstrap ...

  5. hdu 确定比赛名次(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    ...

  6. Python raw_input和input总结 在版本2和版本3中的区别

    Python 2.3.4 (#1, Feb 2 2005, 11:44:13) [GCC 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)] on linux2 Type &q ...

  7. 防止 Google Smart Lock 记忆错的用户名

    默认 chrome 会查找密码上面的那个(非隐藏非禁用)的表单域 如果上面是个短信验证码框,就会将验证码当成用户名提示用户保存. 在用户名 input 上添加 autocomplete="u ...

  8. imperva 更改web界面的密码

    通过SSH作为用户根登录到MX(或通过另一个用户并提升) 运行命令“su oracle” //首先切换到oracle用户 sqlplus secure/(密码)   /用此命令登录到数据库     s ...

  9. Python大数据处理案例

    分享 知识要点:lubridate包拆解时间 | POSIXlt利用决策树分类,利用随机森林预测利用对数进行fit,和exp函数还原 训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析 ...

  10. 15 Defer, Panic, and Recover

    Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...