#include <iostream>
#include <vector>
using namespace std;
void Swap(int &a,int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void Show(vector<int> & vec)
{
vector<int> :: iterator it = vec.begin();
for(it;it != vec.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void Adjust(vector<int> & vec,int start,int end)//时间复杂度O(logn) 空间复杂度O(1) 不稳定
{
int tmp = vec[start];
int i;
for(i=2*start+1;i <= end;i =2*i+1)
{
if(i+1<= end && vec[i] < vec[i+1])//取左右子树最大的那个
{
i++;
}
if(tmp < vec[i])
{
vec[(i-1)/2] = vec[i];
}
else
{
break;
}
}
vec[(i-1)/2] = tmp;
}
void HeapSort(vector<int> & vec)//时间复杂度O(nlogn) 空间复杂度O(n) 稳定
{
int len = vec.size();
if(len <2) return ;
//先调整成一个大根堆
for(int i=(len-2)/2;i>=0;i--)//时间复杂度nlogn
{
Adjust(vec,i,len-1);
}
//每次将堆顶与最后一个数字进行交换,再调堆
for(int i = 0;i < len;++i)//时间复杂度nlogn
{
Swap(vec[0],vec[len-1-i]);
Adjust(vec,0,len-1-i-1);
}
}
int main()
{
int arr[10] = {10,9,8,7,6,4,5,2,1,3};
vector<int> vec(arr,arr+10);
Show(vec);
HeapSort(vec);
Show(vec);
}
堆排序
最新推荐文章于 2024-09-04 23:05:17 发布