排序算法

介绍:排序分为内部排序和外部排序,内部排序指在内存中进行的排序过程;外部排序指在外存中进行排序的过程,但是此过程建立在多次访问内存的基础上(分成一段段利用内部排序进行排序)。

以下排序均属于内部排序:

一、插入排序

1、直接插入排序

  思想:每一步将一个待排序元素,插入到前面已经排好序的序列中去进行比较排序,直到所有元素插完

  图解

  

  代码实现

  

 /**
* 插入排序
*
* @param arr
*/
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
//当前元素开始与前面排好序元素进行比较
while (j > 0 && arr[j] < arr[j - 1]) {
swap(arr,j,j-1);
j--;
}
}
}

2、希尔排序

  思想:把排序序列按照设定的增量进行分组,然后对每一组使用直接插入排序

  说明:

  1. 增量的设定:这个值通常自定义,但是比较常用的增量是gap=length/2(并不是最优)
  2. 增量的修改:每次经过一次排序后,增量通常需要gap=gap/2,直到增量为1时,停止修改
  3. 增量的使用:若增量为n,则当前序列需要分为n组,即一组有length/n个元素
  4. 分组:距离保持一致

  图解:

  

  代码实现:

  

     private static int[] sort(int nums[]){
int length = nums.length;
int gap = length/2;//初始化增量
while(gap>=1){
for (int i=0;i<gap;i++){
//得到了本组所有元素,以下对本组元素进行直接插入排序
for (int j=i+gap;j<nums.length;j=j+gap){//默认第一个元素在已排序序列中,故从第二个元素开始插入比较
while(j>i && nums[j-gap]>nums[j]){
int temp = nums[j-gap];
nums[j-gap] = nums[j];
nums[j] = temp;
j=j-gap;
}
}
}
gap = gap/2;
}
return nums;
}

二、选择排序

1、直接选择排序

  思想:每次遍历比较出最小值,再拿最小值与当前未排序列的第一个位置元素互换位置。n表示元素个数,则第m次比较(n-m)次

  图解

  

  代码实现

  

 private static int[] selectSort(int arr[]){
int flag = 0;//记录待比较序列中最小值位置
for(int i=0;i<arr.length-1;i++){
//第i+1轮比较排序
flag = i;
for(int j=i+1;j<arr.length;j++){
if(arr[flag]>arr[j]){
flag=j; //保存最小值位置
}
}
if(flag!=i) {
//判断最小值是否在目标位置,不是则需要进行交换
int temp = arr[flag];
arr[flag] = arr[i];
arr[i] = temp;
}
}
return arr;
}

2、堆排序

  思想

  图解

  代码实现

三、交换排序

1、冒泡排序

  思想:进行n-1轮排序(n为元素个数)每轮排序中按照“小在前,大在后”的比较规则进行位置调整,每一轮都会冒出一个最大值在尾部(当前比较序列尾部)

  图解

         依次进行n-1轮排序

  代码实现

  

 private int[] bubbleSort(int arr[]){
for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
      for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
        if(arr[j]>arr[j+1]){
          int temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    }
return arr;
}

2、快速排序

  思想:在冒泡排序的基础上进行了优化,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两

  部分数据分别进行快速排序,整个排序过程可  以 递归进行,以此达到整个数据变成有序序列

  过程说明

  ①选取适当的基准数,通常我们选取第一个数为基准数,每一趟依次选取一个基准数,直到结束。

  ②与基准数比较中,小的换到前面,大的换到后面

  ③每趟都是先从右边开始比较,发生一次比较赋值(比较位置元素不变,游标不动;把它的值再复制到目标位置,目标位置移动一个单位)后则从另一方向开始

  ④快速排序停止条件:

  图解

  图片来源于 https://www.cnblogs.com/skywang12345/p/3596746.html

  

  代码实现

  

     /**
* 一次快速排序
* @param array 数组
* @param lo 数组的前下标
* @param hi 数组的后下标
* @return key的下标index,也就是分片的间隔点
*/
public static int partition(int []array,int lo,int hi){
/** 固定的切分方式 */
int key=array[lo];//选取了基准点
while(lo<hi){
//从后半部分向前扫描
while(array[hi]>=key&&hi>lo){
hi--;
}
array[lo]=array[hi];
//从前半部分向后扫描
while(array[lo]<=key&&hi>lo){
lo++;
}
array[hi]=array[lo];
}
array[hi]=key;//最后把基准存入
return hi;
} /**
* 快速排序
* @param array
* @param lo
* @param hi
*/
public static void quickSort(int[] array,int lo ,int hi){
if(lo>=hi){
return ;
}
//进行第一轮排序获取分割点
int index=partition(array,lo,hi);
//排序前半部分
quickSort(array, lo, index - 1);
//排序后半部分
quickSort(array,index+1,hi);
}

四、归并排序

  思想:归并排序采用“分治法”思想,将待排序列拆分位子序列,将个子序列内部排序,再合并各子序列,在子序列之间进行排序。

  图解

  

  在治(合并阶段)图解如下:

  拿上图中最后一步来举例说明吧

  

  代码实现

五、基数排序

  思想

  图解

  代码实现

性能比较

排序算法总结(java实现)的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

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

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

  4. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  5. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  6. 几大排序算法的Java实现(原创)

    几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...

  7. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  8. 基本排序算法——冒泡排序java实现

    冒泡排序是原理最简单的一种排序算法,具体思想就不多说了,代码如下: eclipse4.3中编译通过 package sort.basic; import java.util.Arrays; publi ...

  9. 排序算法练习--JAVA(插入、直接选择、冒泡、快速排序、非递归快速排序)

    排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... package sort; impor ...

  10. 排序算法(JAVA)

    import java.util.Random;      /**  * 排序测试类  *   * 排序算法的分类如下:  * 1.插入排序(直接插入排序.折半插入排序.希尔排序):  * 2.交换排 ...

随机推荐

  1. Linux(16):Shell编程(3)

    vim 编程环境配置: .vimrc 文件配置如下:(.vimrc文件放到家目录下:/root :然后退出 xshell 再登陆进来xshell) set nocompatible set histo ...

  2. luogu题解 P2419 【牛大赛Cow Contest】传递丢包

    题目链接: https://www.luogu.org/problemnew/show/P2419 分析: "在交际网络中,给定若干元素和若干对二元关系,且关系具有传递性. 通过传递性推导出 ...

  3. springboot(十九)-线程池的使用

    我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行. 话不多说,编码开始: 1.创建spri ...

  4. Centos7:JDK1.8环境配置

    1.将压缩包解压缩 tar -zxvf jdk-8u181-linux-x64.tar.gz; 2.配置环境变量 环境变量地址:/etc/profile #set java environment J ...

  5. uploadify 上传文件插件

    今天在项目中要用到文件上传功能时,想借助Jquery方式来实现,于是想到用uploadify插件来实现.不经意间在网上看到了一遍关于这个插件的用法,写的很好.在这里就分享给大家,希望对大家有帮助.以下 ...

  6. 爆路径写后门拿shell的一些姿势

    [PhpMyAdmin后台拿Shell]CREATE TABLE `mysql`.`xiaoma` (`xiaoma1` TEXT NOT NULL );INSERT INTO `mysql`.`xi ...

  7. Java高并发程序设计学习笔记(二):多线程基础

    转自:https://blog.csdn.net/dataiyangu/article/details/86226835# 什么是线程?线程的基本操作线程的基本操作新建线程调用run的一种方式调用ru ...

  8. 框架之一:mybatis

    同时加载驱动包 mysql+mybatis 创建bean对应的mapper接口bookMapper package com.imu.mzw.mapper; import java.util.List; ...

  9. 64位Win7安装Oracle12C临时位置权限错误解决方案

    今天装备安装Oracle12C体验一下,结果遇到问题:请确保当前用户具有访问临时位置所需的权限,无法继续安装,上网查了一下,解决方案如下:  第一步:  控制面板>所有控制面板项>管理工具 ...

  10. select,poll.epoll区别于联系

    select,poll,epoll都是IO多路复用中的模型.再介绍他们特点时,先来看看多路复用的 模型. 同其他IO的不同的是,IO多路复用一次可以等多个文件描述符.大大提高了等待数据准备好的时间的效 ...