#include<iostream>
#define CHANGERATE /=2
using namespace std;
void shellSort(int a[], int n)
{
int counts=0;
int gap, i, j, temp;//gap为排序容器控制,i为插入值位置标记,j为插入排序控制,temp用于临时储存插入排序初值
for(gap = n / 2; gap > 0;gap CHANGERATE)
{
counts++;
for ( i =gap; i <n ; i++)//每次gap的取值决定插入排序比较时初值位置,较大的gap决定了较小的比较次数,gap为1时为遍历比较
{
counts++;
temp = a[i];
for (j = i - gap; j >= 0 && a[j] > temp; j -= gap)//gap的存在将目标数列分割成间隔为gap的子数列,通过较大的gap改变目标数列的数据排布,使gap为1时全数列排序时排序次数大大缩小
{
counts++;
a[j + gap] = a[j];
}
a[j + gap] = temp;
}
}
cout << "counts=" << counts << endl;
}
int main()
{
int a[] = { 4, 5, 1, 3, 2, 0, -3 ,-20, 100, 50 };
shellSort(a, 10);
int i;
for (i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
shell排序个人学习笔记
最新推荐文章于 2024-08-14 21:31:22 发布