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各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...
随机推荐
- 使用AspNetPager控件分页
页面后台写法 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindData(); } } pro ...
- OpenStack_I版 4.Dashboard部署
由python的DjangoWeb框架开发的 使用keystone默认的角色来访问各种服务 Dashboard安装 Dashboard是openstack的Web管理界面,需要将它 ...
- STL(set_pair)运用 CF#Pi D. One-Dimensional Battle Ships
D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes inp ...
- Text Document Analysis CodeForces - 723B
Modern text editors usually show some information regarding the document being edited. For example, ...
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
- 【转载】 Spark性能优化:资源调优篇
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
- Android中的Socket
1. UDP (1)访问网络必须添加权限,访问网络必须添加权限,访问网络必须添加权限,重要的事情说三遍. (2)简述 UDP协议是面向报文的,简单地说,利用UDP访问网络的步骤就是"寄快递& ...
- webpack中hash与chunkhash区别和需要注意的问题
项目发布时,为了解决缓存,需要进行md5签名,这时候就需要用到 hash 和 chunkhash等. 问题一:hash问题 使用 hash 对js和css进行签名时,每一次hash值都不一样,导致无法 ...
- mongo分布式集群搭建手记
一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...
- centos6.5下 hdp-2.4.2安装
(1)准备工作 /usr/sbin/sestatus -v getenforce1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态SE ...