标题:java排序算法之希尔排序
一、分析
希尔排序,就是在直接插入排序中,减少了比较次数【直接插入排序的升级版】。
二、解题
直接插入排序:从第二个元素起,每次取一个元素,插入到该元素的前面位置中,按递增顺序排列的子序列中的合适位置
public int[] directInsert(int[] a) {
for(int i=1;i<a.length;i++) {
int temp=a[i];
while(i>0 && temp<a[i-1]) {
a[i]=a[i-1];
i--;
}
a[i]=temp;
}
return a;
}
希尔排序:
- 首先将上述的直接插入排序变形,将
a.length--》a
使得可以排序任意长度的数组a。
public int[] directInsert02(int[] a,int len) {
for(int i=1;i<len;i++) {
int temp=a[i];
while(i>0 && temp<a[i-1]) {
a[i]=a[i-1];
i--;
}
a[i]=temp;
}
return a;
}
- 其次,eg:
25,36,12,68,45,16,37,22
长度为8,
public int[] shellSort(int[] a) {
for(int i=a.length/2;i>=1;i=i/2) {
for(int j=0;j<i;j++) {
int[] nums=new int[a.length];
int t=0;
for(int p=j;p<a.length;p+=i) {
nums[t++]=a[p];
}
this.directInsert02(nums,t);
t=0;
for(int p=j;p<a.length;p+=i) {
a[p]=nums[t++];
}
}
}
return a;
}
测试代码如下:
/**
* 测试直接插入排序
* @param a
* @return
*/
public int[] directInsert(int[] a) {
for(int i=1;i<a.length;i++) {
int temp=a[i];
while(i>0 && temp<a[i-1]) {
a[i]=a[i-1];
i--;
}
a[i]=temp;
}
return a;
}
@Test
public void test() {
// int[] a=new int[] {32,15,6,48,19,21,2};
// int[] a=new int[] {43,12,35,18,26,57,7,21,43,46};
int[] a=new int[] {32,15,6,48,19,21,27};
a = this.directInsert(a);
for(int in:a) {
System.out.print(in+" ");
}
}
/**
* 测试希尔排序
* @param a
* @param len
* @return
*/
public int[] directInsert02(int[] a,int len) {
for(int i=1;i<len;i++) {
int temp=a[i];
while(i>0 && temp<a[i-1]) {
a[i]=a[i-1];
i--;
}
a[i]=temp;
}
return a;
}
public int[] shellSort(int[] a) {
for(int i=a.length/2;i>=1;i=i/2) {
for(int j=0;j<i;j++) {
int[] nums=new int[a.length];
int t=0;
for(int p=j;p<a.length;p+=i) {
nums[t++]=a[p];
}
this.directInsert02(nums,t);
t=0;
for(int p=j;p<a.length;p+=i) {
a[p]=nums[t++];
}
}
}
return a;
}
@Test
public void test03() {
int[] a=new int[] {32,15,6,48,19,21,2};
// int[] a=new int[] {43,12,35,18,26,57,7,21,43,46};
// int[] a=new int[] {32,15,6,48,19,21,27};
a = this.shellSort(a);
for(int in:a) {
System.out.print(in+" ");
}
}