/**
* Knuth 提出的d=[d/3]+1,下取整。
*
* @param a
*/
private void shellSort2(int[] a) {
int d = a.length;
int temp = 0;
do {
d=d/3+1;
for (int x = 0; x < d; x++) {
for (int i = x + d; i < a.length; i += d) {
int j = i - d;
temp = a[i];
for (; j >= 0 && temp < a[j]; j -= d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
} while (d > 1);
}
/**
* 折半插入排序是稳定的排序
* 又称为二分插入排序,基本思想:设在数组中前i-1个元素是已经排好序的,
* 在插入a[i]时,利用二分搜索的方法找到a[i]的位置插入。
* @param a
*/
private void binaryInsertSort(int[] a) {
int temp = 0;
int i, low, high, middle, k;
for (i = 1; i < a.length; i++) {
temp = a[i];
low = 0;
high = i - 1;
while (low <= high) {
middle = (low + high) / 2;
if (temp < a[middle]) {
high = middle - 1;
} else
low = middle + 1;
}
for (k = i - 1; k >= low; k--)
a[k + 1] = a[k];// 成块移动空出插入位置
a[low] = temp;
}
}
}
排序总结之插入式排序(2)
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:http://www.heiqu.com/44d1e525fad11f1f8a45f70f44806fcb.html