希尔排序
package ShellSort;
import Utils.SortUtils;
public class Demo {
public static void shellSort(int[] a){
int temp,j;
int increment = a.length;
do{
increment = increment/3+1;//如果是直接插入排序,这里的increment都为1。
//System.out.println(increment);
for (int i = increment; i < a.length; i++) {
if(a[i]<a[i-increment]){
temp = a[i];//暂存于temp中
for (j=i-increment; j>=0 && a[j]>temp; j-=increment) {
a[j+increment] = a[j];//记录后移,查找插入位置
}
a[j+increment] = temp;//插入
}
}
}while(increment>1);
}
public static void main(String[] args) {
int[] a = {2,3,5,4,1,6,9,8,7};
shellSort(a);
SortUtils.printString(a);
}
}
复杂度分析
堆排序
package HeapSort;
import Utils.SortUtils;
public class Demo02 {
//堆排序
public static void heapSort(int[] a){
int len = a.length;
//将待排序数据构建为大顶堆
for(int i=(a.length-1-1)/2;i>=0;i--){
heapAdjust(a,i,len);
}
for (int i = a.length-1; i > 0; i--){
//将队顶值与当前未经排序子序列的最后一个值交换
SortUtils.swap(a,0,i);
heapAdjust(a,0,--len);//重新调整大顶堆
}
}
//将待排序序列构建成一个大顶堆
public static void heapAdjust(int[] a,int s,int len){
int temp;
temp = a[s];
for (int i = 2*s+1; i < len; i++) {
if(i<len-1 && a[i]<a[i+1]){
i++;//i为关键字中较大的记录的下标
}
if(temp>=a[i]){//如果父节点本身就大于最大的子节点,终止循环
break;
}
a[s] = a[i];
s = i;
}
a[s] = temp;
}
public static void main(String[] args) {
int[] a = {2,3,5,4,1,6,9,8,7};
heapSort(a);
SortUtils.printString(a);
}
}
复杂度分析
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 19:53:09