排序第一天,回忆关键字

  选择,插入,希尔,归并,快排(包括三向快排),堆排序。

  选择:

    实现原理:内外循环,选择最小,比较。

    关键点:for(k =i+1 ,k<N,k++){a[j]<a[min],min=j}

  插入:

     实现原理:往左插入最小

    关键点:for(int j = i+1, k > 0 && less(a[j],a[j-1],j--)

  希尔:

    实现原理:插入的改进,使用递增序列0,1,4,13………………,分组插入

    关键点:

    while(h<N/3){

      h=3*h+1;

     for(int j = i, j >= h && less(a[j],a[j-h],j=j-h)

 

       h=h/3;

    }

  归并:

    实现原理:原地,自顶向下,自底向上,递归,使整体分成小数组

    关键点:

      mergesort(a,lo,mid);

mergesort(a,mid+1,hi);

merge(a,lo,mid,hi);

for (int k = lo; k <= hi; k++)
if (i > mid)
a[k] = aux[j++];
else if (j > hi)
a[k] = aux[i++];
else if (SortUtils.less(aux[j], aux[i]))
a[k] = aux[j++];
else
a[k] = aux[i++];

}

 

快排:

 实现原理:选择a[lo]第一次,从右往左搜比他大,从左往右搜比他小,就是a[++i]、a[--j]与a[lo]=v对比,小于 大于,三项添加等于

 关键点:切分partition

while (SortUtils.less(a[++i], v))
if (i == hi)
break;
while (SortUtils.less(v, a[--j]))
if (j == lo)
break;
if (i >= j) {
break;
}

 

堆排序

   实现原理:优先队列,有序化,sink

   关键点:for用来构建堆有序,while使用来sink,从a[1]使用,后面exch和less减一

    

int N = a.length;
for (int i = N / 2; i >= 1; i--) {
sink(a, i, N);
}
while (N > 1) {
exch(a, 1, N--);
sink(a, 1, N);
}
}

 

private static void sink(Comparable[] a, int j, int n) {
while (2 * j <= n) {
int h = 2 * j;
if (h < n && less(a, h, h + 1)) {
h++;
}
if (!less(a, j, h)) {
break;
}
exch(a, j, h);
j = h;
}

}

    

posted @ 2015-03-08 02:15  NYK  阅读(127)  评论(0编辑  收藏  举报