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之排序的更多相关文章

  1. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  2. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  3. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  4. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  5. java常见排序方法

    1.java常用排序方法 1) 选择排序         原理:a. 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.   ...

  6. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  7. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  8. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  9. java 集合排序

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  10. Java各种排序算法

      Java各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...

随机推荐

  1. Windows平台 python 常用包的安装

    1. yaml 从http://pyyaml.org/wiki/PyYAML下载对应版本的exe,直接安装就可以. 2. pip 从https://pypi.python.org/pypi/pip#d ...

  2. 异常-----web.xml文件报错 Multiple annotations found at this line: - cvc-complex-type.2.4.b: The content of element 'welcome-file-list' is not complete. One of '{"http://java.sun.c

    1,检查抬头是不是有问题. <?xml version="1.0" encoding="UTF-8"?><web-app version=&q ...

  3. 【原】Spring Boot 配置swagger2没有文档解决方案

    @Bean public Docket customImplementation(){ return new Docket(DocumentationType.SWAGGER_2) .select() ...

  4. CSS3 column属性

    css3 column属性的应用 1.案例源码 <!DOCTYPE html><html lang="en"><head> <meta c ...

  5. java保留小数点后位数以及输出反转数字

    //方法一double b = 8.0/3.0; //与C语言不同,此处8.0和8有所区分 String format = String.format("%.2f,b"); //表 ...

  6. 【CJOJ2316】【模板】可持久化线段树

    题面 Description 这是一道非常直白的可持久化线段树的练习题,目的并不是虐人,而是指导你入门可持久化数据结构. 线段树有个非常经典的应用是处理RMQ问题,即区间最大/最小值询问问题.现在我们 ...

  7. WPF自学入门(五)WPF依赖属性

    在.NET中有事件也有属性,WPF中加入了路由事件,也加入了依赖属性.最近在写项目时还不知道WPF依赖属性是干什么用的,在使用依赖项属性的时候我都以为是在用.NET中的属性,但是确实上不是的,通过阅读 ...

  8. oracle数据库和表的操作

    一.字符函数 (1)连接符 concat --连接符 select concat('10086','-')||'1531234567' 电话号 from dual; (2)首字母大写 initcap ...

  9. 由html,body{height:100%}引发的对html和body的思考

    html,body{height:100%} 今天看到一个CSS样式:html,body{height:100%},第一次看到,感觉挺奇怪,为什么html还需要设置height:100%呢,html不 ...

  10. SQL基础教程读书笔记-3

    5 复杂查询 5.1 视图 1.表和视图的区别表:保存的是实际的数据视图:保存的是SELECT语句.从视图读取数据时,视图会在内部执行该SELECT语句并创建出一张临时表. 2.视图的优点① 无需保存 ...