📅  最后修改于: 2023-12-03 14:55:41.649000             🧑  作者: Mango
梳齿排序(Comb Sort)是一种不稳定的排序算法,是冒泡排序的改进版,由Włodzimierz Dobosiewicz于1980年发明。
梳齿排序的原理是通过定义一个“步长”,不断改变步长大小,对整个序列进行多趟快速排序。随着步长的不断缩小,梳齿排序可以逐渐转变成冒泡排序,最终实现排序。
梳齿排序的时间复杂度为O(n^2), 但在某些情况下可以获得比冒泡排序更快的排序速度。
public class CombSort {
public static void main(String[] args) {
int[] arr = { 8, 3, 9, 1, 2, 7, 5, 4, 6 };
System.out.println("排序前:");
for (int num : arr)
System.out.print(num + " ");
combSort(arr);
System.out.println("\n排序后:");
for (int num : arr)
System.out.print(num + " ");
}
public static void combSort(int[] arr) {
int gap = arr.length;
boolean swapped = true;
while (gap > 1 || swapped) {
if (gap > 1) {
gap = (int) (gap / 1.247);
}
swapped = false;
for (int i = 0; gap + i < arr.length; i++) {
if (arr[i] > arr[i + gap]) {
int temp = arr[i];
arr[i] = arr[i + gap];
arr[i + gap] = temp;
swapped = true;
}
}
}
}
}
CombSort
类,包含一个 main
方法和一个 combSort
方法。main
方法中,创建了一个整数数组 arr
,并输出了排序前的整个数组。combSort
方法排序后,再次输出整个数组,即为排序后的结果。combSort
方法中,首先定义了步长 gap
的初始值,默认等于数组长度。定义 swapped
变量表示是否发生交换,若未发生,则说明排序已完成。while
循环中,先判断步长 gap
是否大于1,若大于1,则按比例缩小步长。for
循环中,对位于当前步长之间相邻元素进行比较,若前一个比后一个大,则交换它们的位置,并将 swapped
设为 true
。梳齿排序虽然不如快速排序、归并排序那样的高端算法稳定,但适用于一些元素分布比较庞杂的情形,通过缩小步长的方式加快排序速度,是一种简单高效的排序方法。