Java实现排序算法1:5种易理解的算法
2016-03-30 23:22
399 查看
今天下班回到学校,突然想起自己平时学习还有过有一些笔记,乱七八糟的,有必要整理一下,顺便也能够复习。就用这篇排序算法作为我CSDN博客的开端,也算是我对自己学习的一种纪录吧。刚开始可能会写得有些稀烂,以后会逐渐改进。出现错误的话,也希望浏览到的朋友提出来,谢谢。
关于排序我会写一个系列,主要是会是各种排序算法的实现,时空复杂度的比较等等,这篇文章里先介绍五种比较简单的排序:冒泡排序,快速排序,直接插入排序,希尔排序和简单选择排序。
然后是使用递归对分治部分的一个简单实现:
直接插入排序是最直白的一种,自然效率上就不会太高。关于时空复杂度,在把所有的排序实现后
会专门写一篇:
插入排序的方法就是:对一个数组,先对第一个数据元素排序,然后对第一和第二个排序(也
就是把第二个插入到其中),然后把第三个插入到第一个和第二个组成的数组中排序(此时已
经排好序),以此类推下去。
至于如何实现,简单的不要不要的:
希尔排序是插入排序的改进版,其核心思路是,先将数组进行分组使用直接插入排序,比如:假设
一个数组有10个元素,以d = 10/2为间隔做插入排序,然后以d/2 为间隔做插入排序,如此反复直
至d=1。此时的数组接近最好状态,然后做最后一次插入排序。效率提高之处在于插入排序在数组接
近最好状态(几乎已经排好序的情况下)时,效率非常高。
具体实现:
简单选择排序则又是另一种易于理解的排序方式。思路就是:在数组中选择最小的数,
然后将其与第一个位置上的数交换,然后从第二个数开始找出最小的,和第二个位置
上的数交换,依次进行下去就能得到最终的排序结果。
核心部分:
关于排序我会写一个系列,主要是会是各种排序算法的实现,时空复杂度的比较等等,这篇文章里先介绍五种比较简单的排序:冒泡排序,快速排序,直接插入排序,希尔排序和简单选择排序。
public bubbleSort(){ int []a = {10,8,15,23,17,6,14,20}; for(int i = 0; i <a.length() - 1; i++){ for(int j = 0; j <a.length()-1-i; j++){ if(a[j] > a[j+1]){ int temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } for(int i = 0; i<a.length(); i++){ System.out.printLn(a[i]); } }
快速排序的思想:选取数组的第一个或者最后一个数为基准数据,设置两个索引i和j,假设我选取最后一个数basic为基准数据,将数组中比basic小的数放在它的左边,将比basic大的数放在它的右边,然后递归下去,就能得到最终的排序结果。具体是如何实现的呢?假设我有10个数,那么设置两个索引i和j,i= 0,j = 9,选取最后一位是基准数据basic,然后把这个位置挖空,将basic存起来(X = basic)。从前往后找比basic大的数(i++),然后找到第一个后,我们就把这个数放到原来basic的位置上,也就是被挖空的位置上。然后这个位置就被挖空了,i就停在了这个位置的索引上,然后我们再去从后向前找比basic小的数,也就是j--,找到第一个就放到刚才被挖空的位置上,然后如此反复,直到i=j,那么目的就达到了,也就是数组中比basic小的数放在它的左边,将比basic大的数放在它的右边,然后依次递归即可。 这一部分代码:
public void getMiddle(int[] a, int i, int j) { int x = a[j]; while(i < j){ while(i < j && a[i] <= x){ i++; } a[j] = a[i]; while(i < j && a[j] >= x){ j--; } a[i] = a[j]; } a[j] = x; return j; }
然后是使用递归对分治部分的一个简单实现:
public quickSort(int[] a, int low, int high){ int middle = getMiddle(a, low, high); quickSort(a, low, middle-1); quickSort (a, moddle +1, high); }
直接插入排序是最直白的一种,自然效率上就不会太高。关于时空复杂度,在把所有的排序实现后
会专门写一篇:
插入排序的方法就是:对一个数组,先对第一个数据元素排序,然后对第一和第二个排序(也
就是把第二个插入到其中),然后把第三个插入到第一个和第二个组成的数组中排序(此时已
经排好序),以此类推下去。
至于如何实现,简单的不要不要的:
public void insert(){ int[] a ={...}; for(int i = 1; i<= a.length; i++){ int temp = a[i]; for(int j = i-1; j >= 0 && a[j] > temp; j--){ a[j+1] = a[j]; } a[j+1] = temp; } for(int i = 0; i<a.length(); i++){ System.out.println(a[i]); } }
希尔排序是插入排序的改进版,其核心思路是,先将数组进行分组使用直接插入排序,比如:假设
一个数组有10个元素,以d = 10/2为间隔做插入排序,然后以d/2 为间隔做插入排序,如此反复直
至d=1。此时的数组接近最好状态,然后做最后一次插入排序。效率提高之处在于插入排序在数组接
近最好状态(几乎已经排好序的情况下)时,效率非常高。
具体实现:
public class ShellSort{ int[] a = {...}; int d = Math.ceil(a.length/2); public void shell(){ for(int i = 0; i<d; i++){ for(int j =i+d; j<a.length; j+=d){ int temp = a[j]; for(int k =j-d; k >= 0&& a[k] > temp; k -=d){ a[k+d] = a[k]; } a[k+d] = temp; } d = Math.ceil(d/2); } for(int i =0; i <a.length; i++){ System.out.println(a[i]); } } }
简单选择排序则又是另一种易于理解的排序方式。思路就是:在数组中选择最小的数,
然后将其与第一个位置上的数交换,然后从第二个数开始找出最小的,和第二个位置
上的数交换,依次进行下去就能得到最终的排序结果。
核心部分:
for(int i = 0; i<a.length; i++){ int temp = a[i]; for(int j =i+1; j<a.length && a[j] <temp; j++){ temp =a[j]; } a[i] = temp; }
相关文章推荐
- [leetcode-332]Reconstruct Itinerary(java)
- Java设计模式之单例模式
- Spring JDBC学习笔记(2):JdbcTemplate的增强版NamedParameterJdbcTemplate
- 将Windows文件路径转换为java中可识别的文件路径
- Java泛型深入理解
- Java 异常
- java中Comparator接口
- java 垃圾回收机制
- java SE基础(Map接口及其实现)
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- spring data jpa 操作JPA 2.0原生api
- Java 多线程实现的三种方法,附两个线程执行不同的输出
- Java SE 疑难点记录
- Java 1.7 ReentrantReadWriteLock源码解析
- Java并发编程:阻塞队列
- java学习之迭代器浅谈
- Struts1与Struts2原理 区别 详解 汇总
- 学习javaEE每一天2016.3.30
- JavaMail发送邮件
- java获取当前时间的年周月季度等的开始结束时间