希尔排序
核心在于:增量设置与循环缩减增量直到增量为1
// 增量初始为数组长度
int gap=len;
// 循环缩减增量
while(gap!=1){
// 增量变化
gap/=2;
}
循环终止或者写成“死循环”,用“break”跳出循环。
// 循环缩减增量
while(1){
// 增量变化
gap/=2;
// 等到增量缩减为1的时候就退出
if(gap==1){
break;
}
}
对增量分割的组,进行组内插入排序
比对原始插入排序:
for(int i=1;i<size;i++){
int temp=a[i];
int j;
for(j=i;j>0&&temp<a[j-1];j--){
a[j]=a[j-1];
}
a[j]=temp;
}
增量插入排序:
对增量分割的组内进行插入排序
for(int i=gap;i<len;i+=gap){
int temp=a[i];
int j;
for(j=i;j>0&&temp<a[j-gap];j-=gap){
a[j]=a[j-gap];
}
a[j]=temp;
希尔排序全部代码:
C++
void shellSort(int a[],int len){
int gap=len;
cout << "len=" << gap << endl;
// 循环缩减增量
while(gap!=1){
// 增量变化
gap/=2;
cout <<"gap=" << gap << endl;
// 等到增量缩减为1的时候就退出
// if(gap==1){
// break;
// }
// 对增量分割的组内进行插入排序
for(int i=gap;i<len;i+=gap){
int temp=a[i];
int j;
for(j=i;j>0&&temp<a[j-gap];j-=gap){
a[j]=a[j-gap];
}
a[j]=temp;
}
}
Java:
public static void main(String[] args){
int[] array={49,38,65,97,76,13,27,49,78,34,12,64,1};
System.out.println("排序之前:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
//希尔排序
int gap = array.length;
while (true) {
//增量每次减半
gap /= 2;
for (int i = 0; i < gap; i++) {
//这个循环里其实就是一个插入排序
for (int j = i + gap; j < array.length; j += gap) {
int temp = array[j];
int k = j - gap;
while (k >= 0 && array[k] > temp) {
array[k + gap] = array[k];
k -= gap;
}
array[k + gap] = temp;
}
}
if (gap == 1){
break;
}
}
System.out.println();
System.out.println("排序之后:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
Python:
# -*- coding: utf-8 -*-
"""
希尔排序
缩减增量的排序
"""
li=[1,3,5,7,9,2,4,6,8,10]
print(li)
def shell(li):
# 增量设定
gap = len(li)
# 循环与循环终止条件
while 1:
gap/=2
gap=int(gap)
# 插入排序
for i in range(gap,len(li),gap):
temp = li[i]
j=i
while j>0 and temp<li[j-gap]:
li[j]=li[j-gap]
# 指针前移gap位
j -= gap
print(li)
li[j]=temp
if gap==1:
# break跳出循环
break
print(li)
shell(li)