交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),插入排序(直接插入排序、希尔排序)

1.冒泡排序算法的运作如下:(从后往前)

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

若文件的初始状态是正序的,冒泡排序最好的时间复杂度为 ;若初始文件是反序的,冒泡排序的最坏时间复杂度为 ,综上,因此冒泡排序总的平均时间复杂度为 ,是一种稳定排序算法。

public void doBubbleSort(int src[]) {

int len = src.length;

int temp;

for(int i=len-1;i>0;--i) {

for(int j=0;j

if(src[j+1]

temp = src[j];

src[j] = src[j+1];

src[j+1] = temp;

}

}

printResult(i, src);

}

}

2.快速排序:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。

下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15   共8个元素

初始状态:     46  30  82  90  56  17  95  15        选择46 作为基准值,i = 0, j = 7

i = 0                                j = 7

15  30  82  90  56  17  95  46       15 < 46, 交换 15 和 46,移动 i, i = 1

i = 1                           j = 7

15  30  82  90  56  17  95  46       30 < 46, 不需要交换,移动 i , i = 2

i = 2                   j = 7

15  30  46  90  56  17  95  82      82 > 46, 交换82 和 46,移动 j , j = 6

i = 2               j = 6

15  30  46  90  56  17  95  82      95 > 46, 不需要交换,移动 j , j = 5

i = 2         j = 5

15  30  17  90  56  46  95  82      17 < 46, 交换46 和 17,移动 i, i = 3

i = 3    j = 5

15  30  17  46 56  90  95  82      90 > 46, 交换90 和 46,移动 j , j = 4

3 = i    j = 4

15  30  17  46 56  90  95  82      56 > 46, 不需要交换,移动 j , j = 3

i  =  j = 3

i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。 3.直接选择排序:

第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。时间复杂度为 O(n2) ,是一种不稳定的排序方法。共需要进行n-1次选择和交换,每次选择需要进行 n-i 次比较 (1<=i<=n-1),而每次交换最多需要3次移动,因此,总的比较次数C=(n*n - n)/2。

4.堆排序:堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。最坏情况下时间复杂度为nlogn。堆排序为不稳定排序,不适合记录较少的排序。操作过程:

1)初始化堆:将R[1..n]构造为堆(每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整));

2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。

5.直接插入排序:数组分为有序区(初始化为一个元素)和无序区,每次从无序区找一个数插入到有序区并保证其仍有序,辅助空间复杂度S(n)=O(1)。是一个就地排序。是一个稳定的排序方法。

6.希尔排序:增量的取值规则为第一次取总长度的一半,第二次取一半的一半,依次累推直到1为止

java 排序经典算法,经典排序算法(java版)相关推荐

  1. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】...

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  2. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  3. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  4. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

  5. java实现十大经典排序算法

    文章目录 前言 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 鸡尾酒排序(Cocktail Sort) 希尔排序(Shell ...

  6. 冒泡排序java代码_看动画学算法之:排序冒泡排序

    点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...

  7. 【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】

    [015-3 Sum(三个数的和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array S of n integers, are there ...

  8. Java常用的八种排序算法与代码实现

    在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力.那Java有哪些排序算法呢?本文小千就来详细说说Java经典的8种排序算法. 经典的排序算法有八种, ...

  9. 【java算法】排序算法大合集

    文章目录 排序分类/排序算法的分类 冒泡排序 选择排序 插入排序 希尔排序 交换法 移位法(效率高 快速排序 归并排序 基数排序 排序算法时间复杂度比较 相关术语补充 各个排序的区别总结 刷题 老子的 ...

  10. 一点就懂的经典十大排序算法

    文章目录 1.概述 2.十大算法性能比较 3.排序算法精讲 3.1 超级经典的排序--冒泡排序和它的优化 3.2 最常用的排序--快速排序(基准值分段,交换,分而治之,递归实现) 3.3 最简单直接的 ...

最新文章

  1. 【转载】中文输入法下onKeyPress不能触发的问题
  2. 返乡大迁徙,任正非说了两个“不要忘了”
  3. matlab里面filename1,matlab 每次从一个txt文件(里面每行是一个图像名字,如1.jpg之类的)读取一行字符串...
  4. (九)linux中断编程
  5. ios 裁剪圆形头像_IOS_iOS如何裁剪圆形头像,本文实例为大家介绍了iOS裁剪 - phpStudy...
  6. 基于RANSAC的激光点云分割
  7. 前端学习之路之CSS (三)
  8. Exchange2010与Office365混合部署升级到Exchange2016混合部署——Ex2016运行Office365混合配置向导...
  9. 【信息系统项目管理师】第1章-信息化和信息系统 知识点详细整理
  10. Struts2的标签库(一)之控制标签
  11. qq视频转码失败怎么办_qq影音为什么不能转码 进行视频转码方法
  12. 台达触摸屏DOP-B系列——通过宏和子画面弹出提示框
  13. C语言输入Aa1Bb2Cc3,C语言shuzu_test.doc
  14. 项目管理(软件开发)之思维导图使用
  15. 京东到家大数据平台演进实战
  16. 微透镜阵列的主要应用_阵列的应用
  17. yara 模式匹配 android,YARA――恶意软件模式匹配利器
  18. 第三部分 数据结构 -- 第四章 图论算法-1383:刻录光盘(cdrom)
  19. 10款Github上最火爆的国产开源项目【2014】
  20. 用 Golang 开发 Android 应用(五)—— Audio(openAL)使用

热门文章

  1. hadoop1 hadoop2 fair-schduler 配置和使用
  2. Enterprise Library 3.0 发布
  3. Centos 6.5-yum安装出现错误解决方案
  4. vcftools报错:Writing PLINK PED and MAP files ... Error: Could not open temporary file.解决方案
  5. 解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题
  6. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
  7. 【报告分享】中国年轻用户电商消费洞察报告:寻找电商换道增长机遇.pdf(附下载链接)...
  8. 【报告分享】2020-2021视频号发展现状与趋势.pdf(附下载链接)
  9. 拓扑之homeomorphic
  10. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统