您的位置:首页 > 其它

(算法)初级排序算法

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

选择排序

遍历整个数组,将第一个元素与整个数组的元素比较,并与最小的元素调换位置;同理,将第二个元素与数组中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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法 算法