~~无论是查资料、翻书、自己总结,总之记了很多笔记,以后慢慢将它分享出来~~
void directInsertSort(int array[],int length)
{
for (int i=2; i<=length; i++)
{
array[0]=array[i];//记录Ki
int j=i-1;
for (; array[j]>array[0]; j--)//条件中当j=0时,array[j]>array[0]自然不成立
{
array[j+1]=array[j];//如果该记录大于Ki则后移
}
array[j+1]=array[0];//上一步条件判断失败时j多走了一个,因此插入到j+1
}
}
void binaryInsertSort(int array[],int length)
{
for (int i=2; i<=length; i++)
{
array[0]=array[i];
int low=1,hight=i-1,mid;
while (low<=hight)//此处通过折半查找的方式确定要插入的位置,而不是顺序比较
{
mid=(low+hight)/2;
if (array[0]<array[mid])//若当前记录小于中间位置的记录则heigh缩小
{
hight=mid-1;
}
else//否则low缩小
{
low=mid+1;
}
}
//while执行完,low则为要插入的位置,即low之后的记录的关键字都比low位置的大
for (int j=i-1; j>=low; j--)//前一步已经找出要插入的位置,因此这里直接将比往后移动
{
array[j+1]=array[j];
}
array[low]=array[0];
}
}
//希尔排序
void ShellInsert(int array[],int length,int d)
{
for (int i=d+1; i<=length; i++)//从增量d划分的第一个子序列的第二个记录开始,顺序扫描整个待排序列,对每个扫描到的记录在其所在的子序列进行直接插入排序
{
array[0]=array[i];
int j=i-d;//当前记录所在子序列的前一个记录
for (; j>0&&array[0]<array[j]; j=j-d)//j=j-d有可能直接跳过j=0,因此需要加上j>0这个条件
{
array[j+d]=array[j];
}
array[j+d]=array[0];
}
}
void ShellSort(int array[],int length)
{
int d=length/2;//初始增量设为数组长度的一半
while (d>=1)
{
ShellInsert(array, length, d);//每次调用,即为一趟排序
d=d/3;//增量每次除以3递减
}
}