Java排序之排序大综合
一、最近写了一些排序,于是和和大家分享一下:(默认都是从小到大排序)
二、冒泡排序
1、什么是冒泡排序:原理是临近的两个数比较大小,将较大的数往后移,这样遍历一趟数组以后,最大的数就排在的最后面(时间复杂的为O(N2))
重复上面步骤N次。
2、原理描述:data{44,77,55,33,66}
第一次运行:data{44,55,33,66,77}
第二次运行:data{44,33,55,66,77}
。。。。。。
第N次执行:data{33,44,55,66,77}
3、参考代码:
import java.util.Arrays; /**
* Description:冒泡排序
* Author: Hey
* Date: 2015/12/7
*/
public class BubbleSort { public static void main(String[] args) {
int[] data = {11, 66, 33, 44, 77, 55}; for (int i = 0; i < data.length-1; i++) {
for (int j = data.length - i; j > 0; j--) {
if (data[i] > data[i + 1]) {
data[i] = data[i] ^ data[i + 1];
data[i + 1] = data[i + 1] ^ data[i];
data[i] = data[i] ^ data[i + 1];
}
}
}
// for(int i=0;i<data.length;i++){
// System.out.println(data[i]);
// }
System.out.println(Arrays.toString(data));
}
}
三、选择排序
1、什么是选择排序:选择排序是选择数组中最小的数将该数移动到数组最前面,将其他元素往后移动,重复N次操作(时间复杂的(O(N2)))
2、原理:data{44,77,55,33,66}
第一次运行:data{33,44,77,55,66}
第二次运行:data{33,44,77,55,66}
。。。。。。。
第N次运行:data{33,44,55,66,77}
3、参考代码:
import java.util.Arrays; /**
* Description:选择排序
* Author: Hey
* Date: 2015/12/7
*/
public class SelectionSort { public static void main(String [] args){
int[] data = {11, 66, 33, 44, 77, 55}; int minData=0;
for(int i=0;i<data.length;i++){
minData=data[i];
for(int j=i+1;j<data.length;j++){
if(data[j]<minData){
data[j]=data[j]^minData;
minData=minData^data[j];
data[j]=data[j]^minData;
}
data[i]=minData;
}
}
System.out.print(Arrays.toString(data));
}
}
四、插入排序:
1、什么是插入排序:插入排序是将数组划分为两个部分:有序部分和无序部分,将无序部分插入有序部分,重复执行N-1次,默认数组第一项就是有序的(时间复杂的O(N2))
2、插入排序的原理:data{44,77,55,33,66}
第一次:data{44,77,55,33,66}
第二次:data{44,55,77,33,66}
。。。。
第N次:data{33,44,55,66,77}
3、参考代码
package cn.edu.insertionsort; import java.util.Arrays; /**
* Description:插入排序
* Author: Hey
* Date: 2015/12/7
*/
public class InsertSort { public static void main(String[]args){
int[] data = {11, 66, 33, 44, 77, 55}; int i;
// int j; for(i=1;i<data.length;i++){
/*int temp=data[i];
for(j=i-1;j>0;j--){
if(data[i]<data[j]){
if(data[j]>data[i]);
data[i]=data[j];
data[j]=temp;
}else{
break;
}
}*/ if(data[i-1]>data[i]){
int temp=data[i];
int j=i;
while(j>0&&data[i]<data[j-1]){
data[j]=data[j-1];
j--;
}
data[j]=temp;
} }
System.out.print(Arrays.toString(data));
} }
五、希尔排序
1、(历史)希尔排序是选择排序的进化版:插入排序算法对大致有序的数组效率比较高;
但是如果是反序,那么插入排序将会进行大量的移动复制,如果先让部分的局部有序,那么久能够减少移动的次数
(什么是希尔排序)先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。
所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,
直至所取的增量 =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
2、关于增量的选取一般用3h+1的算数公式
3参考代码:
import java.util.Arrays; /**
* Description:希尔排序,希尔排序的之间的间隔是使用3h+1(运行个数)来定义的。
* h代表间隔(由于排序算法是基于插入算法的,当数组大小至少为3时,插入排序才比较有效)
* Author: Hey
* Date: 2015/12/7
*/
public class HillSort { public static void main(String[]args){
int[] data = {11, 66, 33, 44, 77, 55}; //计算间隔
int length=data.length;
int h=1;
while(h<=length/3)
h=3*h+1; while(h>0){
for(int i=h;i<length;i++){
int temp=data[i];
int j=i;
while(j>h-1&&data[j-h]>temp){
data[j]=data[j-h];
j-=h;
}
data[j]=temp;
}
h=(h-1)/3;
} System.out.print(Arrays.toString(data));
}
}
六、快速排序
1、什么事快速排序:快速排序是在数组选择一个标准位(其实也就是在数组中选择一个数做参考),将比标志位大的数右移,比标志位小的左移,让缩小范围继续比较
3、参考代码:
package cn.edu.quicksort; import java.util.Arrays; /**
* Description:快速排序
* Author: Hey
* Date: 2015/12/7
*/
public class QuickSort { int[] data = {11, 66, 33, 44, 77, 55}; public void quickSort(int left, int right) {
if ((right - left) <= 0)
return;
else {
int pivot = data[right]; int parttion=recQuickSort(left,right,pivot);
quickSort(left, parttion-1);
quickSort(parttion + 1, right);
}
} public int recQuickSort(int left, int right, int pivot) {
int leftPtr=left-1;
int rightPtr=right;
while (true) {
while (data[++leftPtr] < pivot) ;
while (data[--rightPtr] > pivot) ;
if (leftPtr >= rightPtr)
break;
else
swap(leftPtr, rightPtr);
}
swap(leftPtr, right);
return leftPtr;
} public void swap(int i, int j) {
data[i] = data[i] ^ data[j];
data[j] = data[j] ^ data[i];
data[i] = data[i] ^ data[j];
} public static void main(String[] args) {
QuickSort q=new QuickSort(); q.quickSort(0,q.data.length-1); System.out.print(Arrays.toString(q.data));
}
}
七:堆排序
1、什么事堆排序:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。
可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,
即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
2、参考代码:
package cn.edu.heapsort; import java.util.Arrays; /**
* Description:堆排序
* Author: Hey
* Date: 2015/12/7
*/
public class HeapSort { private int size;
private Node[]nodes;
private int elms; public HeapSort(int size){
elms=0;
this.nodes=new Node[size];
} public boolean insert(int value){
if(elms>=value)
return false;
Node node=new Node(value);
nodes[elms]=node;
trickUp(elms++); return true;
} public Node remove(){
Node temp=nodes[0];
nodes[0]=nodes[--elms];
trickDown(0);
return temp;
} private void trickUp(int index){ int parent=(index-1)/2;
Node temp=nodes[index];
while(index>0&&nodes[parent].value<temp.value){
nodes[index]=nodes[parent];
index=parent;
parent=(parent-1)/2;
}
nodes[index]=temp;
} private void trickDown(int index){ Node temp=nodes[0];
int largeChild=0; while(index<elms/2){
largeChild=maxNode(index);
if(temp.value>nodes[largeChild].value)
break;
else{
nodes[index]=nodes[largeChild];
index=largeChild;
}
}
nodes[index]=temp;
} public static void main(String []args){ HeapSort h=new HeapSort(10);
h.insert(10);
h.insert(23);
h.insert(12);
h.insert(17);
h.insert(33); h.print();
System.out.println(h.remove());
System.out.println(h.remove());
System.out.println(h.remove());
System.out.println(h.remove());
System.out.println(h.remove()); } private void print() {
System.out.println(Arrays.toString(nodes));
} private int maxNode(int parent){
int left=parent*2+1;
int right=parent*2+2; if (right<elms&&nodes[left].value<nodes[right].value)
return right;
else
return left;
} private class Node{
public int value;
public Node(int value){
this.value=value;
} @Override
public String toString() {
return "HeapSort{" +
"value=" + value +
'}';
}
} }
Java排序之排序大综合的更多相关文章
- Java常用的7大排序算法汇总
1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...
- 【面试必备】常见Java面试题大综合
一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSort ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- Java实现希尔排序
华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这 ...
- Java数组的排序算法
在Java中,实现数组的排序算法有很多,如冒泡排序法.选择排序法.直接插入法和快速排序法等.下面介绍几种排序算法的具体 实现. 本文引用文献:Java必须知道的300个问题. 1.冒泡排序法 1.1 ...
- java 的八大排序
import java.util.Arrays;import java.util.*; public class Sort { /** * 插入排序 */ public static void ins ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- Java实现桶排序和基数排序
桶排序代码: import java.util.Arrays; /** * 桶排序 * 工作的原理是将数组分到有限数量的桶里 * 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序 ...
- java,桶排序,冒泡排序,快速排序
1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...
随机推荐
- SQL Server | Mysql 对表的unique 的实现方式
在ANSI SQL 标准中unique 有两种实现方式 1.是可以插入多个空值.也就是说多个null值看成是互不相同的. 2.是只可以插入一个空值,也主是说把所有的空值看也是相同的. 在SQL Ser ...
- DatabaseMetaData的用法(转)
http://blog.csdn.net/sdliubo/article/details/6546889
- Java基础—ClassLoader的理解(转)
默认的三个类加载器 Java默认是有三个ClassLoader,按层次关系从上到下依次是: Bootstrap ClassLoader Ext ClassLoader System ClassLoad ...
- BZOJ 4503 两个串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4503 [题目大意] 给出S串和T串,计算T在S中出现次数,T中有通配符'?'. [题解 ...
- 使用jQuery创建模态窗口登陆效果
日期:2013-8-22 来源:GBin1.com 隐藏模态窗口技术是一种很好的解决方案,用于处理不是特有必要出现在网页上的界面元素.社交网络可以使用模态窗口传达私人讯息以及只针对会员才能看 到的表 ...
- iOS实战(零):开发社区、文档等资源
社区 Apple官方资源 Xcode文档库: Window->Documentation and API Reference (可以在xcode的Preferences中下载最新的文档) iOS ...
- iOS 中多线程的简单使用
iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...
- mysql安装详细步骤图解
本文转自http://blog.csdn.net/fanyunlei/article/details/21454645 别看图多,其实mysql的安装十分简单,一路next即可,只是注意倒数第三步,设 ...
- Win7下安装Apache+PHP+MySQL
Win 7 下搭建 WAMP 环境本文安装方法适用于 Windows7 下的 Apache + MySQL + PHP(WAMP)安装,同时也适用于 Windows XP 系统下的安装和配置.一.安装 ...
- gridview回顾
第一看asp.net是在做项目之前,感觉收获也很大,第二次看gridview是在做完项目之后对GridView的回顾,这次的感觉是:我需要多想点,知识直到用时方觉少.直入正题吧,看gridview. ...