(算法)初级排序算法
2017-10-25 20:16
288 查看
这篇文章想整理对一下选择排序、插入排序以及希尔排序的理解
注:先说一下几个常用到方法:
exch(Comparable[] a,int i,int j ):调换数组a中a[i]及a[j]的位置;
show(Comparable[] a):打印数组a中的每一个元素;
less(Comparable v,Comparable w) :返回boolean类型,v是否小于w
boolean isSorted( Comparable[] a):返回boolean类型,数组a是否有序
排序算法的主要核心在于sort()即排序部分,篇幅缘故以上方法的具体实现请参考另一篇文章:排序算法类的模板 http://blog.csdn.net/weixin_37892687/article/details/7834606
具体实现代码如下:
同理,将第N张牌与前面的N-1张牌逐个比较,或者调换,或者不再变动,则换第N+1张牌开始比较。
以此类推,直至所有元素都排列完毕。
具体实现代码如下
希尔排序的思想是使数组中任意间隔为h的元素都是有序的,交换不相邻的元素以对数组的局部进行排序。
并在最终使用插入排序为 局部有序的数组 排序。
具体代码如下
注:先说一下几个常用到方法:
exch(Comparable[] a,int i,int j ):调换数组a中a[i]及a[j]的位置;
show(Comparable[] a):打印数组a中的每一个元素;
less(Comparable v,Comparable w) :返回boolean类型,v是否小于w
boolean isSorted( Comparable[] a):返回boolean类型,数组a是否有序
排序算法的主要核心在于sort()即排序部分,篇幅缘故以上方法的具体实现请参考另一篇文章:排序算法类的模板 http://blog.csdn.net/weixin_37892687/article/details/7834606
选择排序
遍历整个数组,将第一个元素与整个数组的元素比较,并与最小的元素调换位置;同理,将第二个元素与数组中a[2]…a[a.length]的元素相比较,取最小元素进行调换位置。以此类推,直至所有元素都排列完毕。具体实现代码如下:
public class Selection { public static void sort(Comparable[] a) { int N =a.length; for(int i=0;i<N;i++) { int min =i; for(int j=i+1;j<N;j++) { if(less(a[j],a[min])) { min=j; } exch(a,i,min); } } } }
插入排序
假设你手上有一副扑克牌,从第二张牌开始,将第二张牌与第一张比较,如果小于,就将两者调换位置,大于或等于则不变。,然后再将第三张牌与第二张比较,若小于,则调换位置;再与第一张牌比较,若小于,则再次调换位置,同理,但大于或等于不再变动。此时,前三张牌已呈有序状态。同理,将第N张牌与前面的N-1张牌逐个比较,或者调换,或者不再变动,则换第N+1张牌开始比较。
以此类推,直至所有元素都排列完毕。
具体实现代码如下
package algorithm; public class Insertion{ /* * 整理所有元素,使其有序排列 */ public static void sort(Comparable[] a){ for(int i = 1;i<a.length;i++) { /* * 比较a[i]及a[i-1],当条件为true时(a[i]<a[i-1]),不断交换位置,实现调整. */ for(int j = i;j>0&&less(a[j],a[j-1]);j--) { exch(a,j,j-1); } } } }
希尔排序
希尔排序是对插入排序的改进:对于大规模乱序数组,使用插入算法将会很慢,因为他只会交换相邻的元素,假设a[0]为最大的值,那么他就需要不断与相邻的元素交换,直到最后一位。希尔排序的思想是使数组中任意间隔为h的元素都是有序的,交换不相邻的元素以对数组的局部进行排序。
并在最终使用插入排序为 局部有序的数组 排序。
具体代码如下
public static void sort(Comparable[] a){ int h=1; int N =a.length; while(h<N/3) { h = 3*h+1; //1,4,13,40,121,364... } while(h>=1) { for(int i =h;i<N;i++) { /* * 将a[i]插入到a[i-h],a[i-2*h],a[i-3*h]...之中 */ for(int j = i;j>=h&&less(a[j],a[j-h]);j-=h) { exch(a,j,j-h); } } h=h/3; } }
相关文章推荐
- 『算法』之 初级排序算法总结
- 算法第四版学习笔记之初级排序算法
- 《算法》阅读笔记-2.1初级排序算法
- 算法手记(5)初级排序算法
- [读书笔记]算法(Sedgewick著)·第二章.初级排序算法
- 算法初级02——荷兰国旗问题、随机快速排序、堆排序、桶排序、相邻两数的最大差值问题、工程中的综合排序算法
- 算法手记(5)初级排序算法
- 用 Python 学习算法:初级排序算法
- 算法--排序算法的介绍与总结(五)
- 算法 排序算法--快速排序
- Johnson-trotter 算法,一种高效的全排序算法的java实现
- 排序算法-10-算法-分治法(Divide and Conquer)
- python入门-分类和回归各种初级算法
- 算法基础之三种排序算法
- 挖掘算法中的数据结构(五):排序算法总结 和 索引堆及优化(堆结构)
- 浅谈算法和数据结构: 二 基本排序算法
- C语言的初级算法大全
- 排序算法分类和算法时间复杂度比较
- 华为oj初级 24点游戏算法
- 初级3D地形随机生成算法源码(Ogre实现)放出