(算法)初级排序算法

来源:互联网 发布:客户端软件开发 编辑:程序博客网 时间:2024/05/28 14:57

这篇文章想整理对一下选择排序、插入排序以及希尔排序的理解
注:先说一下几个常用到方法:
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;        }    }