步骤:1.根据步长将数组分为若干组,然后步长减半
2.组内进行直接插入排序
直到步长为0时停止
空间复杂度:O(1)
时间复杂度:O(n²) (最坏情况下)
是不稳定的排序方法
#include <iostream> #include <stdlib.h> #include <math.h> #include <string.h> #include <algorithm> using namespace std; int A[1000]={0,49,38,65,97,76,13,27,49,55,4}; void shellSort(int n){//n是数组大小 int i,j,dk; for(dk=n/2;dk>=1;dk=dk/2){ //根据步长分组 没错步长减半 for(i=dk+1;i<=n;i++){ //分组内进行直接插入排序 if(A[i]<A[i-dk]){ A[0]=A[i]; for(j=i-dk;j>0&&A[0]<A[j];j-=dk){ A[j+dk]=A[j]; } A[j+dk]=A[0]; } } } } int main(){ shellSort(10); for(int i=1;i<=10;i++){ cout<<A[i]<<" "; } return 0; }