希尔排序(缩小增量排序):
1959年Shell发明,第⼀个突破O(n^2)的排序算法,是简单插⼊排序的改进版。
基本思想:设待排序元素序列有n个元素,首先取一个整数【temp=n/2】作为间隔将全部元素分为temp个子序列,所有距离为temp的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔temp,重复上述子序列划分和排序工作。直到最后取temp=1,将所有元素放在同一个子序列中排序为止。
下面直接图示理解:
给出原序列:
注意:有两个7,对第一个加了*标注,排序后位置发生改变。
最终序列:
上代码实现:
class SortWork {
public static void printArray(int[] array) {//工具方法
for (int i : array) {
System.out.print(i + " ");
}
}
}
public class Bubble {
public static void main(String[] args) {
int[] array = new int[]{5,8,12,7,10,3,7,9};
shellSort(array);
SortWork.printArray(array);
}
public static void shellSort(int[] array) {
int n = array.length;
if (n <= 1) {
return;
} else {
int temp = n / 2;
while (temp >= 1) {
for (int i = temp; i < n; i++) {
int val = array[i];
int j = i - temp;
for (; j >= 0; j -= temp) {
if (val < array[j]) {
array[j + temp] = array[j];
}else {
break;
}
}
array[j+temp] = val;
}
temp /=2;
}
}
}
}
最后附上代码运行结果:
复杂度进行分析:
时间复杂度:
介于O( n ^2)和O(nlogn)之间,视它的最好最坏以及平均复杂度具体分析
空间复杂度:
在排序过程中,并没有新数组的产生,所以空间复杂度是 O( 1 )
稳定性:
在排序完成后,两个相同的元素位置(上面图示的7*和7)位置发生了改变,所以是不稳定的
理解至此,结束!!!
版权声明:本文为qq_42699061原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。