timsort(优化后归并)
核心:提取降序数组升级为升序
数组本质都是部分有序的,
因此第一步:将所有部分降序数组全部翻转(这里直接逆序就好)
这一步模板:
void reverse(int q[],int l,int r)
{
for(int i=l,j=r;i<=j;i++,j--)swap(q[i],q[j]);
}
void array_reverse(int q[],int N)
{
if(N==1&&N==0)return;
int i=1,l=0,tmp=0,stage_judge;
if(q[0]<=q[1])stage_judge=1;//升序标记
else stage_judge=0;
while(i<N)
{
if(q[i]>q[i+1])
{
if(stage_judge==1)stage_judge=0;
++i;
}
else if(q[i]<=q[i+1])
{
if(stage_judge==0)
{
if(tmp!=l-1)++l;
reverse(q,l,i);
tmp=i;
stage_judge=1;
}
++i;//前进一个
l=i;//l=前进一位之后的i
}
}
}
核心:栈处理归并
先将所有已知的升序排列的压入总栈,
这一步:
void stack_check(int N)//对栈进行检验,并且要的是归并两个连续短区间
{
int stack_pos1,stack_pos2,stack_pos3;
int stack_length1,stack_length2,stack_length3;//1最顶,3最底层
pop(stack_pos1,stack_length1);
pop(stack_pos2,stack_length2);
pop(stack_pos3,stack_length3);
if(stack_length2<stack_length1||stack_length3<stack_length1+stack_length2)//x>y或者x+