刚打开CSDN就看到這个,明显触动的心,最近正好刚开始学算法,也决定打算开始写博客,写自己的学习笔记,学习过程,学习经历。希望自己不好太懒,能每天坚持写一篇,实在累不想写就转发个好的文章。
学了一星期的算法,正在看算法—第四版,看到了第3章—查找,不知道自己看得会不会太快,我也没怎么看后面的习题,看一俩道這样,实现的话,有些有实现,但是我都是会时不时去默写。
今天就总结下排序吧!
java实现
//选择排序
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);
}
}
}
//插入排序
public class Insertion{
public static void sort(Comparable[] a){
int N = a.length;
for(int i=1;i<N;i++){
for(int j=i;j>0&& less(a[j],a[j-1]);j--)
exch(a,j,j-1);
}
}
}
</pre><pre>
//希尔算法
public class Shell{
public static void sort(Comparable[] a){
int N=a.length;
int h =1;
while(h<N/3) h = 3*h+1;
while(h>=1)
{
for(int i= h;i<N;i++)
{
for(int j =i;j>=h&&less(a[j],a[j-1];) j -=h)
exch(a,j,j-h);
}
h=h/3;
}
}
}
//原地归并算法
public static void merge(Comparable[] a , int lo, int mid ,int hi){
int i=lo; int j =mid+1;
for(int k=lo;k<=hi;k++)
aux[k]=a[k];
for(int k=lo;k<=hi;K++)
if (i > mid ) a[k]=aux[j++]
else if (j>hi) a[k]=aux[i++]
else if (less(aux[j],aux[i])) a[k]=aux[j++]
else a[k]=aux[i++]
}
public class Merge{
private static Comparable[] aux;
public static void sort(Comparable[] a){
axu = new Comparable[a.length];
sort(a, 0 , a.length -1);
}
private static void sort(Comparable[] a,int lo, int hi){
if(hi <= lo) return;
int mid = lo +(hi-lo)/2;
sort(a , lo , mid);
sort(a,mid+1,hi);
merge(a, lo,mid,hi);
}
}