快速排序在随机数据表现比现较堆排好。
虽说堆排和快排都是nlog(n)级的,数据比较,堆排的常数是快排的2.5倍。
在非随机数据下,快排的就没有什么优势了,特别是全一样的数时,达到了n^2的上限
#include <iostream>
#include <ctime>#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn = 1000000;
template <class T>
void _QUICK_SORT(T *begin, T *end)
{
while(begin < end)
{
T *p = begin;
for(T *q = begin; q < end; q++)
{
if((*q) < (*end))
{
T tmp = *q; *q = *p; *p = tmp; p++;
}
}
T tmp = *p; *p = *end; *end = tmp;
if(end - p > p)
_QUICK_SORT(begin, p-1);
begin = p + 1;
}
}
template <class T>
void SORT(T *begin, T *end)
{
_QUICK_SORT(begin, end - 1);
}
template <class T>
void AdjustHeap(T a[], int i, int len)
{
int l, r, largest;
while(true)
{
l = i << 1|1;
r = l + 1;
largest = i;
if(l <= len && a[largest] < a[l]) largest = l;
if(r <= len && a[largest] < a[r]) largest = r;
if(largest != i)
swap(a[i], a[largest]), i = largest;
else break;
}
}
template <class T>
void BuildHeap(T a[], int len)
{
for(int i = len / 2; i >= 0; i--)
AdjustHeap(a, i, len);
}
template <class T>
void HeapSort(T a[], int len)
{
len --;
for(int i = len / 2; i >= 0; i--)
AdjustHeap(a, i, len);
for(int i = len; i > 0; i--)
{
swap(a[0], a[i]);
AdjustHeap(a, 0, i);
}
}
struct li
{
double a;
friend bool operator <(const li &fir, const li &sec)
{
return fir.a < sec.a;
}
};
int cmp()
{
ifstream myin("mysortout.txt");
ifstream tin("sortout.txt");
for(int i = 0; i < maxn; i++)
{
int a, b;
myin >> a;
tin >> b;
if(a != b) {
cout << i << " is not same!\n";
return 0;
}
}
tin.close();
myin.close();
return 1;
}
int main(){
int cas = 10;
srand((unsigned)time(NULL));
li a[maxn];
time_t start, stop;
while(cas--)
{
ofstream out("data.txt");
for(int i = 0; i < maxn; i++)
{
a[i].a = 0;
out << a[i].a<< "\t";
}
out.close();
start = clock();
sort(a, a+maxn);
stop = clock();
cout << (stop - start) * 1.0/CLOCKS_PER_SEC << endl;
ifstream indata("data.txt");
for(int i = 0; i < maxn; i++)
indata >> a[i].a;
indata.close();
start = clock();
HeapSort(a, maxn);
stop = clock();
cout << (stop - start) * 1.0/CLOCKS_PER_SEC << endl;
cout << "success\n\n";
}
return 0;
}