1,堆排序:转自:http://www.cnblogs.com/codingmylife/archive/2012/09/04/2671078.html
#include <iostream>
#include <algorithm>
using namespace std;
template<typename T>
void unguarded_heapify(T *data, size_t size, size_t top)
{
while (true)
{
size_t min = top;
if (top * 2 < size && data[top * 2] < data[min])
{
min = top * 2;
}
if (top * 2 + 1 < size && data[top * 2 + 1] < data[min])
{
min = top * 2 + 1;
}
if (top == min) return;
swap(data[top], data[min]);
top = min;
}
}
template<typename T>
void make_min_heap(T *begin, T *end)
{
if (begin == NULL || end == NULL)
{
return;
}
if (begin == end || begin + 1 == end)
{
return;
}
size_t len = end - begin;
for (size_t top = len / 2; top >= 1; --top)
{
// Special offset.
unguarded_heapify(begin - 1, len + 1, top);
}
}
void topk(const int *begin, const int *end, int *buffer, size_t *k)
{
if (begin == NULL || end == NULL || buffer == NULL || k == NULL)
{
return;
}
if (begin == end || *k == 0)
{
return;
}
memset(buffer, 0, *k * sizeof(int));
const int *p = begin;
int *dest = buffer;
while (p != begin + *k && p != end)
{
*dest++ = *p++;
}
if (p == end)
{
*k = end - begin;
}
else
{
make_min_heap(buffer, dest);
while (p != end)
{
if (*p > *buffer)
{
*buffer = *p;
unguarded_heapify(buffer - 1, *k + 1, 1);
}
++p;
}
}
}
int main(int argc, char **argv)
{
int data[] = {4, 5, 1, 3, 5, 6, 7, 2};
int *result = new int[10];
size_t k = 3;
topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
copy(result, result + k, ostream_iterator<int>(cout, " "));
cout << endl;
k = 10;
topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
copy(result, result + k, ostream_iterator<int>(cout, " "));
cout << endl;
k = 1;
topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
copy(result, result + k, ostream_iterator<int>(cout, " "));
cout << endl;
k = 8;
topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
copy(result, result + k, ostream_iterator<int>(cout, " "));
cout << endl;
k = 0;
topk(data, data + sizeof(data) / sizeof(data[0]), result, &k);
copy(result, result + k, ostream_iterator<int>(cout, " "));
cout << endl;
delete[] result;
return 0;
}
2.快排:转自:http://blog.csdn.net/fanzitao/article/details/7617223
public class TopK_Quick {
public static int Partition(int a[],int low,int high)
{
a[0]=a[low];
int pivokey = a[low];
while(low<high)
{
while(low<high && a[high]>=pivokey) --high;
a[low] = a[high];
while(low<high && a[low]<=pivokey) ++low;
a[high]= a[low];
}
a[low]=a[0];
return low;
}
public static void display(int a[],int k)
{
for(int i=1;i<=k;i++)
{
System.out.print(a[i]+" ");
}
}
public static int selectK(int a[],int start,int end,int k)
{
int index = 0;
if(start<end)
{
index = Partition(a,start,end);
if(index == k)//正好找到第k大的数
{
index = k;
}else if(index < k)//还要从index的右边找k-index个数
{
index = selectK(a,index+1,end,k-index);
}else if(index > k)//k个数都在Index的左边
{
index = selectK(a,start,index-1,k);
}
}
return index;
}
public static void main(String args[])
{
int k=0;
int a[]={0,49,38,29,65,97,76,13,27,49,22,19};
if(k>0&&k<=a.length-1)
{
selectK(a,1,a.length-1,k);
display(a,k);
}else{
System.out.println("Are You Kidding Me?");
}
}
}