希尔排序(Shell Sort)
升级版的插入排序,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1), 即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。
时间复杂度:
1)最好情况o(n)
2)最坏情况o(n^3/2)
性能高于插入排序 但不稳定。
算法稳定性:通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。
static void shellSort(int[] array) {
if (array != null && array.length > 0) {
int i, j, gap, key;
int n = array.length;
for (gap = n / 2; gap > 0; gap /= 2) //步长
{
for (i = 0; i < gap; i++) //直接插入排序
{
for (j = i + gap; j < n; j += gap) {
if (array[j] < array[j - gap]) {
key = array[j];
int k = j - gap;
while (k >= 0 && array[k] > key) {
array[k + gap] = array[k];
k -= gap;
}
array[k + gap] = key;
}
}
}
}
}
}```
/**
- 将数组的2个位置交换
*/
static void swap(int[] array, int i, int j) {
if (array != null && array.length > 0) {
if (i >= 0 && j >= 0 && i <= array.length && j <= array.length) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}```