天津大学2016算法题
纯暴力了属于是,关键是,好像和题意不符。。。
先找出来最接近平均值的元素,然后和第一个元素交换位置,再用第一个元素做枢轴去进行快排
(貌似没有优化呃
//用平均值作为枢轴的快排
#include<iostream>
#include<cmath>//使用其中的abs函数
using namespace std;
void func(int a[],int low,int high)
{
int ans=0;
for(int i=low;i<=high;i++)
{
ans+=a[i];
}
ans=ans/(high-low+1);//计算平均值
int pos = low;
int key= abs(a[low] - ans);
for (int i = low + 1; i <= high; i++)
{
int diff = abs(a[i] - ans);
if (diff < key)
{
key = diff;
pos = i;
}
}
// 将最接近平均值的元素作为枢轴
swap(a[low], a[pos]);
}
int Partition(int a[],int low,int high)
{
func(a,low,high);
int pivot=a[low];
while(low<high)
{
while(low<high&&a[high]>=pivot)
high--;
a[low]=a[high];
while(low<high&&a[low]<pivot)
low++;
a[high]=a[low];
}
a[low]=pivot;
return low;
}
void Quicksort(int a[],int low,int high)
{
if(low<high)
{
int pos=Partition(a,low,high);
Quicksort(a,low,pos-1);
Quicksort(a,pos+1,high);
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int low=0,high=n-1;
Quicksort(a,low,high);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}