java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言2 分类2 稳定性3 时间复杂度4 Java实现版本5 1、冒泡排序6 2、选择排序

时间:2021-08-24 22:06:23

好吧 ~~csdn太难用了。。。。尼玛。。。写了半天的也无法弄进去。。。lz正在找更好地博客,or放在github上打算。。

下边是lz自己的有道云分享,大概内容是

http://note.youdao.com/share/?id=62ed43d615aef54455f47b34be190efb&type=note   

真心无语了。。。博主的github:

https://github.com/wbzj1110/

java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言2 分类2 稳定性3 时间复杂度4 Java实现版本5 1、冒泡排序6 2、选择排序

前言...2

分类...2

稳定性...3

时间复杂度...4

Java实现版本...5

1、冒泡排序...6

2、选择排序...9

3、直接插入排序...10

4、希尔排序...12

5、堆排序...16

介绍 大小顶堆...16

堆排序的算法要点...19

堆排序算法的实现...19

6、归并排序...21

递归实现...23

迭代实现...24

7、快速排序...25

代码实现...25

快速排序的优化...27

优化选取基准点...27

优化不必要的交换...29

优化小数组时的排序方案...30

优化递归操作...31

8、总结回顾...34

9、...35

10、...36

11、...36

12、...36

 

前言

分类

稳定性

时间复杂度

http://blog.csdn.net/jiuyueguang/article/details/12028393

http://blog.csdn.net/frances_han/article/details/6458067

 

 

Java实现版本

1、冒泡排序

 

但是这个有个缺点就是对于 这种的效率很低

 

2种冒泡改良算法

http://blog.csdn.net/tjunxin/article/details/8711389

双向冒泡

http://blog.csdn.net/tjunxin/article/details/8711389

总结的最好

http://blog.csdn.net/kong357385142/article/details/6343376

 

java实现方式

正规的冒泡  里边有双向冒泡

 

2、选择排序

 

 

3、直接插入排序

直接插入排序

 

 

4、希尔排序

 

I 1   V 5   X 10

注意 iv 表示的是5-1  等于4

同理 ix 表示的是10-1 等于9

从IX变为VI  从9变为6

IX倒转180°  然后

哈哈

直接插入的那种排序

在这2个情况下效果非常高

  希尔排序(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。希尔排序并不稳定,O(1)的额外空间,时间复杂度为O(N*(logN)^2)。最坏的情况下的执行效率和在平均情况下的执行效率相比相差不多。

第一趟排序为总数的10/2也就是间隔为5

第二趟排序排序为5/2 =3间隔为3

第三趟排序间隔为2

排序完成,也是直接插入排序,但是是多个同时进行直插

 

希尔排序的思想可以利用在其他排序  但是利用在直插更多

直插的源码

修改直插的希尔排序的源码

Gap是间隔数哈  第一趟间隔多少

 

 

5、堆排序

介绍大小顶堆

堆排序是完全二叉树

 

大顶堆  根节点都大于左右孩子

小顶堆:根节点小于左右孩子

堆排序的算法要点

堆排序算法的实现

这里用大顶堆

调整大顶堆 HeapAdjust

与交换swap  根节点与最后一个元素交换

第一个为字符长度

6、归并排序

递归实现

迭代实现

 

 

7、快速排序

代码实现

swap就是交换数组 low high位置的值

快速排序的优化

http://www.2cto.com/kf/201303/196811.html

 

优化选取基准点

优化Partition

优化前

优化后

优化不必要的交换

还是该Partition

优化前

优化后

优化小数组时的排序方案

数组小的时候直接插入排序

优化递归操作

原来的

优化的

这样就变为尾递归了

再进一步优化

@这一这里相当于方法quickSor在执行一次时,用了while(low < high)这个循环条件,这里就是关键所在

a.第一次进入循环:这个循环执行了一次递归后,然后执行low = pivot + 1

b.再次进入循环:执行int pivot = partition(low, high, array);,对右端进行递归,因为(low = povit + 1) > (high = povit -1 ),所以后面的quickSort(low, pivot - 1, array);将会终止,然后重复执行a,b;

进一步优化,递归小的,大的通过尾递归搞定

数组越大效果越明显。

8、总结回顾

稳定性

放在内存与硬盘分为

内排序的分类

时间复杂度空间复杂度