排序第一天,回忆关键字
選擇,插入,希爾,歸并,快排(包括三向快排),堆排序。
選擇:
實現(xiàn)原理:內(nèi)外循環(huán),選擇最小,比較。
關(guān)鍵點:for(k =i+1 ,k<N,k++){a[j]<a[min],min=j}
插入:
實現(xiàn)原理:往左插入最小
關(guān)鍵點:for(int j = i+1, k > 0 && less(a[j],a[j-1],j--)
希爾:
實現(xiàn)原理:插入的改進,使用遞增序列0,1,4,13………………,分組插入
關(guān)鍵點:
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;
}
歸并:
實現(xiàn)原理:原地,自頂向下,自底向上,遞歸,使整體分成小數(shù)組
關(guān)鍵點:
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++];
}
?
快排:
實現(xiàn)原理:選擇a[lo]第一次,從右往左搜比他大,從左往右搜比他小,就是a[++i]、a[--j]與a[lo]=v對比,小于 大于,三項添加等于
關(guān)鍵點:切分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;
}
?
堆排序
實現(xiàn)原理:優(yōu)先隊列,有序化,sink
關(guān)鍵點:for用來構(gòu)建堆有序,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;
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/ykong/p/4321266.html
總結(jié)
以上是生活随笔為你收集整理的排序第一天,回忆关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 文件夹的颜色代表什么意思
- 下一篇: Servlet和JSP学习指导与实践(二