#define MAX_SIZE 10
typedef struct
{
int m[MAX_SIZE ];
int length;
} SqList;
//用排序,铁定跑不了这个swap函数,最好自己写一个
void swap(SqList *q, int i, int j);
void swap(SqList *q, int i, int j)
{
int temp = q->m[i];
q->m[i] = q->m[j];
q->m[j] = temp;
}
/*希尔排序,前面介绍的三种排序的时间复杂度都是O(n*n)
而这一次的希尔排序是第一批突破O(n*n)的排序算法
他的核心精髓是那个增量序列,每一次移动都是一个批量的序列移动
可是他应该选择什么作为增量呢?这一点,只能凭感觉了,没有确凿的数据证明,哪个是最好的增量序列,
自己根据实践去开发
希尔排序的时间复杂度是O(n^3/2)就是n的二分之三次方;要好过前面几章的N的平方!!!!
*/
/*前面的直接插入排序,有些时候效率是很高的,比如当记录本身就是有序的,只需要少许的插入操作,即可。
还有就是记录少的时候,也很高效,而这个希尔排序,其实和直接插入排序有点相像的,自己注意看啊!!!
*/
void shellsort(SqList *L){
int i, j, incream;
incream = L->length;
do
{
incream = incream / 3 + 1; //增量序列
for (i = incream + 1; i <= L->length; i++)
{
if (L->m[i] < L->m[i - incream])
{
L->m[0] = L->m[i];
for (j = i - incream; j > 0 && L->m[j] > L->m[0]; j -= incream)
{
L->m[j + incream] = L->m[j];//记录后移, 查找插入位置
}
L->m[j + incream] = L->m[0]; //插入
}
}
} while (incream > 1);
}