Java之排序
1.插入排序
假设第一个数已经是排好序的,把第二个根据大小关系插到第一个前面或维持不动,把第三个根据前面两个的大小关系插到对应位置,依次往后。
public class InsertSort {
public static void main(String[] args){
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp = 0;
for(int i = 1; i < a.length; i++)
{
int j = i - 1;
temp = a[i];
for( ; j >= 0&&temp < a[j]; j--) //每次检查前一个
{
a[j+1] = a[j]; //将大于temp的值整体后移一个单位
}
a[j+1] = temp; //最后把当前位置的值恢复到对应位置
}
for( int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
选择排序:最好情况时间复杂度O(n),最差情况时间复杂度为O(n2),平均时间复杂度为O(n2),稳定,空间复杂度为O(1)。
2.选择排序
选择排序就是选出最值与当前位置的元素交换位置,每次选出一个值,对所有未排序的走一遍。
public class SelectSort {
public static void main(String[] args){
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp;
int position = 0;
for( int i = 0; i < a.length; i++)
{
temp = a[i];
for( int j = i + 1; j <a.length; j++)
{
if( a[j] < temp)//找出最小的,值放在temp,下标放在position
{
temp = a[j];
position = j;
}
}
a[position] = a[i];
a[i] = temp;//最小的和当前下标为i的元素交换位置
}
for( int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
选择排序:最好情况时间复杂度为O(n2),最差情况时间复杂度为O(n2),平均时间复杂度为O(n2),稳定,空间复杂度为O(1)
3.冒泡排序
冒泡排序是每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换,每一轮都会出一个最大的或者最小的去到对应的位置。
public class BubbleSort {
public static void main(String[] args){
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp;
for( int i = 0; i < a.length; i++)
{
for( int j = 0; j <a.length - i - 1; j++)
{
if(a[j+1]<a[j])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for( int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
冒泡排序:最好情况时间复杂度为O(n),最坏时间复杂度O(n2),平均时间复杂度为O(n2),稳定,空间复杂度为O(1)
4.希尔排序(shell sortion)
算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

public class ShellSort {
public static void main(String[] args){
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp;
double d1 = a.length;
while( true )
{
d1 = Math.ceil( d1/2);
int d = (int) d1;
//分组
for( int x = 0; x < d; x++)
{
//按照插入排序进行排序
for( int i = x + d; i < a.length; i += d)
{
int j;
temp = a[i];
for( j = i - d; j >= 0 && a[ j] > temp ; j -= d)
{
a[ j + d] = a[ j];
}
a[ j + d] = temp;
}
}
if(d==1)break;
}
for( int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
希尔排序:最好情况时间复杂度为O(n),最坏时间复杂度O(nlgn),平均时间复杂度为O(nlgn),不稳定,空间复杂度为O(1)
5.快速排列
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
public class QuickSort {
public static int getMiddle(int[] list, int low, int high) {
int tmp = list[low]; //数组的第一个作为中轴
while (low < high) {
while (low < high && list[high] >= tmp) {
high--;
}
list[low] = list[high]; //比中轴小的记录移到低端
while (low < high && list[low] <= tmp) {
low++;
}
list[high] = list[low]; //比中轴大的记录移到高端
}
list[low] = tmp; //中轴记录到尾
return low; //返回中轴的位置
}
public static void _quickSort(int[] list, int low, int high) {
if (low < high) {
int middle = getMiddle(list, low, high); //将list数组进行一分为二
_quickSort(list, low, middle - 1); //对低字表进行递归排序
_quickSort(list, middle + 1, high); //对高字表进行递归排序
}
}
public static void quick(int[] a2) {
if (a2.length > 0) { //查看数组是否为空
_quickSort(a2, 0, a2.length - 1);
}
}
public static void main(String[] args){
int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
quick(a);
for( int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
快速排序:最好情况时间复杂度为O(nlgn),最坏时间复杂度O(nlgn),平均时间复杂度为O(nlgn),不稳定,空间复杂度为O(1)
6.归并排序
Java之排序的更多相关文章
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- java 集合排序(转)
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- java:高速排序算法与冒泡排序算法
Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /** * * @Description: * @author:cuiyaon ...
- java常见排序方法
1.java常用排序方法 1) 选择排序 原理:a. 将数组中的每个元素,与第一个元素比较 如果这个元素小于第一个元素, 就将这个 两个元素交换. ...
- java希尔排序
java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- Java常用排序算法及性能测试集合
测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...
- java 集合排序
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- Java各种排序算法
Java各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...
随机推荐
- 生物结构变异分析软件meerkat 0.189使用笔记(二)
一. 运行meerkat 前面已经依序安装了meerkat 的环境和meerkat,运行了预处理一步,在相对应的bam文件目录下生成了大批文件,因此,当要用meerkat处理某个bam文件时,应先将该 ...
- dtls_srtp学习笔记
注:以下为rfc5764的学习笔记,不保证完全正确. DTLS-SRTP是DTLS的一个扩展,将SRTP加解密与DTLS的key交换和会话管理相结合.从SRTP的角度看,是为其提供一种新的key协商管 ...
- .Net Core使用Redis的一个入门简单Demo
本例子讲述一个在.Net core环境中对Redis数据库进行增删改查操作. 首先,要安装好Redis数据库,至于怎么安装,本文不再赘述,可以自行百度,有很详细的教程. 安装好之后,在CMD中输入 r ...
- toggle的用法(点击更换不同的function)当指定元素被点击时,在两个或多个函数之间轮流切换。
一,用法 <html> <head> <script type="text/javascript" src="/jquery/jquery. ...
- 如何用python和苹果Turicreate学习框架来识别图像?
大多数人听到深度学习,都会望而却步,因为会觉得很难,在这个人工智能飞速进步的时代,我也来抓一下时代的尾巴~ 两周前,我开始接触到python和Turicreate框架,经过不懈的努力,终于有所收获,特 ...
- c#抽取pdf文档标题(4)——机器学习以及决策树
我的一位同事告诉我,pdf抽取标题,用机器学习可以完美解决问题,抽取的准确率比较高.于是,我看了一些资料,就动起手来,实践了下. 我主要是根据以往历史块的特征生成一个决策树,然后利用这棵决策树,去判断 ...
- 分享调用Java private方法
上周在修复bug时,发现Java类中某方法是private,且类中没有用到,第一感觉是方法多余.其实通过分析,发现原来Native Code会通过JNI调到此方法.这也给自己启发,平时做Code re ...
- 从头编写asp.net core 2.0 web api 基础框架 (5) + 使用Identity Server 4建立Authorization Server (7) 可运行前后台源码
前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...
- 我的linux一万小时
这不是一篇鸡汤文,因为我并没有在使用 Linux 一万小时后成为 Linux 达人,甚至在很多方面,我连新手都算不上.我走的这些弯路能篇成一本很有参考价值的反面教材,下面,我在www.itxdl.cn ...
- three.js 实现全景以及优化(1)
实现一个三维全景; 然后思考优化问题; 于是我问了下webgl技术交流群朋友有啥解决方案; 对于krpano.js 的了解,只是知道百度全景用了这个技术; 最后还是选择了群友给出的three.js ...