//two way 经过思考后 one way 中第一次原因后 因为
// /错的?????? 我晕了??
// /(问题在于两两相比较不完全,如例子的第二次gap = 5 / 2 = 2
// //排序后
// 13 27 49 55 4 49 38 65 97 26
// 1A 1B 1C 1D 1E
// 2A 2B 2C 2D 2E)
// 1A 1B 比较,1B 1C 比较 但是1A和1C却没有比较!!!!
// /请诸位自己调试一下!!!!!!!!!!!!!!这很重要!!!!
/*
for(int i=0; i<gap; i++)
{
//因为要有很多组
for(int j=gap+i;j<len;j += gap)
{
if(a[j]<a[j-gap])
{
int temp =a[j];
a[j] = a[j-gap];
a[j-gap] = temp;
}
}
}*/
// 解决方法:对1A 1B 1C 1D 1E进行 直接插入排序!!! 所以:
void ShellSort(int* a,int len)
{
int gap;//zu
for(gap=len/2;gap>0;gap /=2)
{
for(int i=0; i<gap; i++)//gap个组
{
//因为组有很多元素
for(int j=gap+i;j<len;j += gap)
{
if(a[j]<a[j-gap])
{// //直接插入排序
int temp =a[j];//复制哨兵
int k = j-gap; //k 和 i 的意义不一样
for( ;k>=0&&a[k]>temp;k -=gap)
{
a[k + gap] = a[k]; //后移
}
a[k+gap] = temp;//插入哨兵 元素
}
}
}
}
}
- 同理将其简单化:
void ShellSort2(int* a, int n)
{
int j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (j = gap; j < n; j++)//从数组第gap个元素开始
if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}