数据结构与算法之希尔排序
希尔排序是插入排序的优化版本.插入排序的思路是每次跟前一个比较,需要交换则交换,然后指针向后移动,再次与前面的比较,如果不需要交换则表示前边的前边也不需要交换.
希尔排序则是通过添加一个步长的概念,每次把当前元素与增加步长后的元素比较,如果交换则交换.然后再次增加步长去比较,这个过程与插入排序一样.希尔排序与插入排序的
区别在于希尔排序通过步长将数组划分为子数组,将子数组通过插入排序.而步长也要不断的递减,直到步长是1此时就退化为插入排序.
这个算法最好情况下时间复杂度:O(n)平均情况下时间复杂度:O((nlog(n))^2)
public static void xier(int[] arr) {
int gap = arr.length;
while ((gap = gap / 2) > 0) {
for (int i = gap; i < arr.length; i++) {
for (int j = i; j >= gap; j -= gap) {
if (arr[j] < arr[j - gap]) {
int temp = arr[j];
arr[j] = arr[j - gap];
arr[j - gap] = temp;
} else {
break;
}
}
}
}
}
以下代码提供一个测试方法.
public static void main(String[] args) {
Random random = new Random();
while (true) {
int length = random.nextInt(100);int[] arr = new int[length];
int[] arr2 = new int[length];
for (int x = 0; x < length; x++) {
int i = random.nextInt(100);
arr[x] = i;
arr2[x] = i;
}
xier(arr);
Arrays.sort(arr2);
boolean equals = Arrays.equals(arr2, arr);
System.out.println(equals);
if (!equals) {
break;
}
}
}