一.分类:

1)插入排序(直接插入排序、希尔排序)

2)交换排序(冒泡排序、快速排序)

3)选择排序(直接选择排序、堆排序)

4)归并排序

5)分配排序(基数排序)

所需辅助空间最多:归并排序

所需辅助空间最少:堆排序

平均速度最快:快速排序

不稳定:快速排序,希尔排序,堆排序。

先来看看 8种排序之间的关系:

二.常见排序

1.冒泡排序(BubbleSort)

1.依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。

2.原理图

 public class BubbleSort {
public static void main(String[] args) {
int[] a = {1,42,354,6,5,7,74,4,675,6,45345,3,64,3,4,365,34,3,43,45,34,563,64,457,546,4};
int temp =0;
for (int i = 0; i < a.length-1; i++) { //n个数比较n-1次
for (int j = 0; j < a.length-1-i; j++) { //注意j的范围
if (a[j]>a[j+1]) {
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]); //遍历排序好的数组
}
}
}

2.快速排序(QuickSort)

1.基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

2.原理图

 public class QuickSort {
public static void sort(int data[], int start, int end) {
if (end - start <= 0) {
return;
}
int last = start;
for (int i = start + 1; i <= end; i++) {
if (data[i] < data[start]) {
int temp = data[++last];
data[last] = data[i];
data[i] = temp;
}
}
int temp = data[last];
data[last] = data[start];
data[start] = temp;
sort(data, start, last - 1); //排序所在数的前一部分
sort(data, last + 1, end);   //排序所在数的后一部分
}
public static void main(String[] args) {
int[] a = {1,42,354,6,5,7,74,4,675,6};
sort(a, 0, a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]); //遍历已经排序好的数组
}
}
}

3.插入排序(InsertSort)

1.将数列分为有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。

2.原理图

 public class InsertSort {
public static void Insert(int data[]) {
for (int i = 1; i < data.length; i++) {
for (int j = i; j > 0; j--) { //随着i值增大,j值每次插入的次数也增大
if (data[j] < data[j - 1]) {
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] a = {1,42,354,6,5,7,74,4,675,6};
Insert(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]); //遍历已经排序好的数组
}
}
}

4.选择排序(SelectionSort)

1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

2.原理图

public class SelectionSort {
public static void selectionSort(int data[]){
for (int i = 0; i < data.length-1; i++) {
int minVal = data[i];
int minIndex = i;
for (int j = i+1; j < data.length; j++) {
if (data[j]<minVal) { //将当前数与minVal比较
minVal = data[j]; //如果当前数小于minVal则把当前数赋给minVal
minIndex = j; //把当前索引赋给minIndex
}
} if(minVal != data[i] && minIndex != i){ //如果上一步有交换
data[minIndex] = data[i];//则把当前数放到当前最小数组的位置,如此反复
data[i] = minVal;
}
}
}
public static void main(String[] args) {
int[] a = {1,42,354,6,5,7,74,4,675,6,45345,3,64,3,4,365,34,3,43,45,34,563,64,457,546,4};
selectionSort(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);//遍历排序好的数组
}
}
}

常见的几种java排序算法的更多相关文章

  1. 用 Java 实现常见的 8 种内部排序算法

    一.插入类排序 插入类排序就是在一个有序的序列中,插入一个新的关键字.从而达到新的有序序列.插入排序一般有直接插入排序.折半插入排序和希尔排序. 1. 插入排序 1.1 直接插入排序 /** * 直接 ...

  2. 8种Java排序算法整理

    package org.hbz.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; im ...

  3. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  4. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

  5. java排序算法(一):概述

    java排序算法(一)概述 排序是程序开发中一种非常常见的操作,对一组任意的数据元素(活记录)经过排序操作后,就可以把它们变成一组按关键字排序的一组有序序列 对一个排序的算法来说,一般从下面三个方面来 ...

  6. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  7. java排序算法(四):冒泡排序

    java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...

  8. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  9. Java排序算法(二)

    java排序算法(二) 二.改进排序算法 2.1希尔排序 定义:希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. ...

随机推荐

  1. node的url模块

    .parse(url,query2obj[boolean],ignorePrototype[boolean]) .format({}) 和.parse相反,将带有url参数属性的对象组装成url .r ...

  2. Spring + Struts + Hibernate 简单封装通用接口

    1.BaseDao public interface BaseDao<T> { /** * 获取符合条件的记录数 * @param filter * @param sortName * @ ...

  3. JDBC基本使用方法

    JDBC基本使用方法 JDBC固定步骤: 加载驱动 String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true& ...

  4. Crystal | 水晶方法的七大特征,你了解吗?

    本文摘自敏捷开发 20世纪90年代末,Alistair Cockburn提出水晶方法论. 自2001年的敏捷宣言提出以来,以极限编程为首的一系列敏捷方法逐渐走入大众视野,其中就包括水晶方法(Cryst ...

  5. mysql 优化(包含sql语句的书写)

    http://blog.chinaunix.net/uid-11640640-id-3426908.html  mysql性能优化-慢查询分析.优化索引和配置 2012-11-30 15:18:42 ...

  6. 在ORACLE中实现SELECT TOP N的方法----[转]

    1.在ORACLE中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询. ...

  7. myeclipse快捷键代码

    复制来源百度文库http://wenku.baidu.com/link?url=2DLLTMdq4q_ZrK1Zqg34ElzDePSLC3qfKxi7P2et7NO-g7JErrYS4Dl8dbtR ...

  8. 为什么Tableviewcell创建时可以不判空

    dequeueReuseableCellWithIdentifier:与dequeueReuseableCellWithIdentifier:forIndexPath:的区别: 前者不必向tableV ...

  9. poj2391 最大流+拆点+二分答案+Floyd

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19553   Accepted: 4 ...

  10. 【Spring】Spring AOP详解(转载)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...