学了一星期的算法,正在看算法—第四版,看到了第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);
- }
- }