#include<iostream>
using namespace std;
void hill(int *a,int len)//希尔
{
unsigned sen=len/2;
while(sen)//sen>=1
{
for(unsigned i=sen;i<len;i++)
{
unsigned j=i; //添加j过渡使用,用i的话会导致循环无法结束
int insert=a[i];
while(j>=sen && insert<a[j-sen])//这个出错原本是 i>=0
{
a[j]=a[j-sen];
j-=sen;
}
a[j]=insert; //插入
}
sen=sen/2; //缩小长度
}
}
void adding(int *a,int min,int mid,int max)
{
int tem[20];//这个可以用动态数组实现
int m=min,n=mid+1;
int k=0;//记录tem有多少数据
while(m!=mid+1 && n!=max+1)//来回比较两边,如果有一边满了则退出循环
{
if(a[m]<a[n])
{
tem[k++]=a[m++];
}
else
{
tem[k++]=a[n++];
}
}
if(m!=mid+1)//将另一组未满的加上
{
while(m!=mid+1)
tem[k++]=a[m++];
}
else
{
while(n!=max+1)
tem[k++]=a[n++];
}
//k为tem容量
for(int i=0,j=min;i<k;i++)//min为原生数组的首部
{
a[j++]=tem[i];
}
}
void merger(int *a,int min,int max)//归并
{
if(min<max)
{
int mid=(max+min)/2;
merger(a,min,mid);
merger(a,mid+1,max);
adding(a,min,mid,max);
}
}
void quick(int *a,int min,int max1) //快排
{
if(min>max1)
return;
//先从右到左找比基数小的,再从左到右找比基数大的
//填坑法
int i=min,j=max1;
int pause=a[min];
while(i<j)
{
while(a[j]>=pause && i<j)
{
j--;
}
if(i<j)
a[i++]=a[j];
while(a[i]<pause && i<j)
{
i++;
}
if(i<j)
a[j--]=a[i];
}
a[i]=pause;
quick(a,min,i-1);
quick(a,i+1,max1);
}
int main()
{
int a[10]={10,9,8,7,6,5,4,3,2,1};
size_t data=sizeof(a)/sizeof(int);
/* if(data!=1)
hill(a,data);*/
// merger(a,0,data-1);
quick(a,0,data-1);
for(auto it : a)
{
cout<<it<<ends;
}
return 0;
}
06-08
228