选择,插入,希尔,归并,快排(包括三向快排),堆排序。
选择:
实现原理:内外循环,选择最小,比较。
关键点: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;
}
}