按照自己的理解写的堆排序。感觉和二分有点像。时间复杂度n*log n。
#include <iostream>
using namespace std;
int n,arr[101];
void creatstack(int i) //大根堆。边界问题。
{
while(i!=1)
{
if( arr[i]>arr[i/2] )
{
swap(arr[i],arr[i/2]);
i=i/2;
}
else
break;
}
}
void stacksort(int N)
{
swap(arr[1],arr[N]); //之后就是从上往下了。
int p=1;
while(p*2+1<N) //这里的问题。
{
if(arr[p*2]>arr[p*2+1]&&arr[p]<arr[p*2])
{
swap(arr[p*2],arr[p]);
p=p*2;
}
else if(arr[p*2]<=arr[p*2+1]&&arr[p]<arr[p*2+1]) //这是进行保证了啊。
{
swap(arr[p*2+1],arr[p]);
p=p*2+1;
}
else
break; //仅仅只是通过两种可能来实现所有的情况。
if(arr[p]<arr[p*2]&&p*2+1==N)swap(arr[p],arr[p*2]);
}
if(arr[p]<arr[p*2]&&p*2+1==N)swap(arr[p],arr[p*2]);
}
int main()
{
cout<<"请输入数组的大小"<<endl;
cin>>n;
cout<<"请输入数组中的值"<<endl;
for(int i=1;i<=n;i++)
cin>>arr[i];
//初建堆。
for(int i=2;i<=n;i++)
creatstack(i);
//堆排序。(从小到大进行排序)
for(int i=n;i>=2;i--)
stacksort(i);
for(int i=1;i<=n;i++)
cout<<arr[i]<<" "; //大根堆,那就是从小到大进行排序吧。
cout<<endl;
return 0;
}
还有一种写法,不过不太好。
#include <iostream>
using namespace std;
const int inf=101,themax=100;
int arr[inf];
int n;
void creatstack(int i) //小根堆.
{
while(i!=1)
{
if( arr[i]<arr[i/2] ) //不对,就是一个的。所以是没啥问题的。
swap( arr[i],arr[i/2] );
else
break;
i=i/2;
}
}
int stacksort() //也许你可以从这方面来进行推导。用一共有几层来进行约束应该好一点吧。
{
arr[1]=themax; //对啊,既然通过层次不行,那就直接通过其他的方向吧。
int i=1; //其实直接通过个数来限定会更好一点。
while(1)
{
if(arr[i]==arr[i*2] && arr[i]==arr[i*2+1])
break;
if(arr[i*2]>arr[i*2+1])
{
swap(arr[i],arr[i*2+1]);
i=i*2+1;
}
else
{
swap(arr[i],arr[i*2]);
i=i*2;
}
}
return arr[1];
}
int main()
{
for(int i=0;i<inf;i++)
arr[i]=themax;
cout<<"请输入数组的大小"<<endl;
cin>>n;
cout<<"请输入数组中的值"<<endl;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
}
for(int i=2;i<=n;i++)
{
creatstack(i);
}
//初建堆应该是可以的,之后就是进行排序了。
int ans[inf],k=1,tran=arr[1]; //是最小的。
for(int i=1;i<=n;i++)
{
ans[k++]=tran;
tran=stacksort();
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
cout<<endl;
return 0;
}