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各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...
随机推荐
- Django学习-4-request获取数据
app下views.py 获取前端HTML数据的一些方法 def func(request): # request.me ...
- angular路由操作
在单页面应用程序中比如angular应用,我们需要根据url的变化(即:不同的请求),来分配不同的资源.根据请求的URL来决定执行哪个模块,这个过程叫路由,同时,我们需要设计路由规则. 下面给出一个简 ...
- html中的div span和frameset框架标签
Div和span 1. div独占一层,由div九不允许有别的. 2. span标签不是独自占用一行,span一般用来设置字体. 框架标签: 什么是框架标签,就是把一个页面分成很多 ...
- Java并发编程笔记4-线程池
我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线 ...
- 使用PHPword中文乱码并且下载的方法
如果你的编码格式是utf-8的话就用这个 1.找到 Section.php 的 addText 函数 $givenText = utf8_encode($text); 改成 $givenText = ...
- 《Master Bitcoin》学习笔记01
前言 关于比特币入门,其运行原理(理解性描述),什么是挖矿,还有一些学习资料的整理,详见此博客链接 第一章讲比特币的历史,算是导入,上面的博客链接有概括. 第二章举了使用比特币交易的例子,其中介绍了一 ...
- ssm框架之将数据库的数据导入导出为excel文件
在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...
- layer与iframe 间值的相互传递
在A页添加 <input id="handle_status" value="" hidden="hidden"> jq代码 l ...
- 智能合约语言 Solidity 教程系列8 - Solidity API
这是Solidity教程系列文章第8篇介绍Solidity API,它们主要表现为内置的特殊的变量及函数,存在于全局命名空间里. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应 ...
- NancyFX 第十一章 Bootstrapping
本章我们将深入Nancy的内部,对Nancy的内部组件进行修改和调整. 那什么是bootstrap哪?字典里是这么介绍的: 一般而言,处于引导中(bootstrapping)是在终端用户可以使用之前开 ...