一.分类:

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

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

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

4)归并排序

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

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

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

平均速度最快:快速排序

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

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

二.常见排序

1.冒泡排序(BubbleSort)

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

2.原理图

  1. public class BubbleSort {
  2. public static void main(String[] args) {
  3. 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};
  4. int temp =0;
  5. for (int i = 0; i < a.length-1; i++) { //n个数比较n-1次
  6. for (int j = 0; j < a.length-1-i; j++) { //注意j的范围
  7. if (a[j]>a[j+1]) {
  8. temp = a[j];
  9. a[j] = a[j+1];
  10. a[j+1] =temp;
  11.  
  12. }
  13. }
  14. }
  15. for (int i = 0; i < a.length; i++) {
  16. System.out.println(a[i]); //遍历排序好的数组
  17. }
  18. }
  19. }

2.快速排序(QuickSort)

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

2.原理图

  1. public class QuickSort {
  2. public static void sort(int data[], int start, int end) {
  3. if (end - start <= 0) {
  4. return;
  5. }
  6. int last = start;
  7. for (int i = start + 1; i <= end; i++) {
  8. if (data[i] < data[start]) {
  9. int temp = data[++last];
  10. data[last] = data[i];
  11. data[i] = temp;
  12. }
  13. }
  14. int temp = data[last];
  15. data[last] = data[start];
  16. data[start] = temp;
  17. sort(data, start, last - 1); //排序所在数的前一部分
  18. sort(data, last + 1, end);   //排序所在数的后一部分
  19. }
  20. public static void main(String[] args) {
  21. int[] a = {1,42,354,6,5,7,74,4,675,6};
  22. sort(a, 0, a.length-1);
  23. for (int i = 0; i < a.length; i++) {
  24. System.out.println(a[i]); //遍历已经排序好的数组
  25. }
  26. }
  27. }

3.插入排序(InsertSort)

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

2.原理图

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

4.选择排序(SelectionSort)

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

2.原理图

  1. public class SelectionSort {
  2. public static void selectionSort(int data[]){
  3. for (int i = 0; i < data.length-1; i++) {
  4. int minVal = data[i];
  5. int minIndex = i;
  6. for (int j = i+1; j < data.length; j++) {
  7. if (data[j]<minVal) { //将当前数与minVal比较
  8. minVal = data[j]; //如果当前数小于minVal则把当前数赋给minVal
  9. minIndex = j; //把当前索引赋给minIndex
  10. }
  11. }
  12.  
  13. if(minVal != data[i] && minIndex != i){ //如果上一步有交换
  14. data[minIndex] = data[i];//则把当前数放到当前最小数组的位置,如此反复
  15. data[i] = minVal;
  16. }
  17. }
  18. }
  19. public static void main(String[] args) {
  20. 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};
  21. selectionSort(a);
  22. for (int i = 0; i < a.length; i++) {
  23. System.out.println(a[i]);//遍历排序好的数组
  24. }
  25. }
  26. }

常见的几种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. keepalived的一些。。

    继续采坑..有些坑,踩了才知道. 1.文件位置不能错. 首先是安装, 源码编译,--prefix=/usr/local/keepalive 然后用 sbin/keepalive -f  ...conf ...

  2. git :error: bad signature fatal: index file corrupt

    删除.git/index文件再执行: git reset 不行的话就执行: git read-tree  --empty https://stackoverflow.com/questions/213 ...

  3. node的http模块

    node中的几个常用核心模块的api返回的都是eventEmitter的实例,也就是说都继承了on和emit方法,用以监听事件并触发回调来处理事件. http模块处理网络请求通常是创建一个server ...

  4. 1.1Go环境搭建之Linux

    1.ssh远程登录Linux服务器,可选用iTerm.xshell ssh root@ip 2.建议配置好阿里云yum源.epel源 安装git yum install git 3.下载go源码包 / ...

  5. fastDFS多线程并发执行出现的问题

    ---------------------  原作者:Java高级开发  来源:CSDN  原文:https://blog.csdn.net/hang1995/article/details/7924 ...

  6. MySQL(4)— 数据查询

    四.数据查询(DQL) 4-1.查询指定字段 select 完整 语法: select [distinct] 字段名1 [as] [别名],字段名2 [as] [别名] from 表1 [ left ...

  7. Palindromes _easy version(hdu2029)

    输入格式:首先一个整型,然后循环不带空格未知长度的字符串. 思考:首先用scanf_s()输入整型,然后一个大循环,用gets_s()函数输入字符串. 注意:scanf_s()多加了一个%c,& ...

  8. 一文讲透Modbus协议

    前言 Modbus是一种串行通讯协议,是Modicon公司(现在的施耐德电气 Schneider Electric) 于1979年为使用可编程逻辑控制器(PLC)通信而发表.Modbus已经成为工业领 ...

  9. [ES6系列-04]再也不乱“哇”了:用 let 与 const 替代 var

    [原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 JavaScript 中定义变量 ...

  10. [PHP学习教程 - 网络]002.$_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]介绍($_SERVER URL Infomation)

    引言:在使用原生PHP的时候,对于URL路径的切割,如:域名,查询参数等等的提取,通常绝大多数兄弟会忽略$_SERVER中定义的内置常量的关系,这里为大家讲解一下. 常用的URL请求路径$_SERVE ...