排序原理:。
①选定一个增长量,以增长量作为数据分组的依据,对数据进行逻辑分组。
②多分组的数据按组进行插入排序。
③减小增长量,重复第二步操作,直到增长量为1。
增长量的确定:
int h = 1;
while(h < a.length/2) {
h = 2*h+1;
}
时间复杂度:
最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^1.3)
空间复杂度:
O(1)
稳定性:
不稳定
实现:
API设计:
①主排序算法用于排序
public static void sort(int[] a)
② 比较API,用于比较两个元素大小
private static boolean greater(int[] a,int v,int w)
③交换API,用于交换两个索引位置的值
private static void exchange(int[] a,int i,int j)
API实现:
public static void sort(int[] a) {
//1.确定增长量级
int h = 1;
while(h < a.length/2) {
h = 2*h+1;
}
//希尔排序
//1.找到要排序的元素
for(int i = 0;i < a.length;i ++) {
//2.将该元素与该组其他元素比较
for(int j = i; j >= h;j-=h ) {
if(greater(a[i-h],a[i])) {
exchange(a,i-h,i);
}else {
break;
}
}
}
}
//greater方法用于获取两数最大值
private static boolean greater(int v,int w) {
if(v <= w)
return false;
else
return true;
}
//exchange方法用于交换两个元素
private static void exchange(int[] a,int i,int j) {
int temp = 0;
temp = (int) a[i];
a[i] = a[j];
a[j] = temp;
}
网友评论