快速排序
#include <iostream>
using
namespace
std;
void
Qsort(
int
a[],
int
low,
int
high)
{
if
(low >= high)
{
return
;
}
int
first = low;
int
last = high;
int
key = a[first];
/*用字表的第一个记录作为枢轴*/
while
(first < last)
{
while
(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];
/*将比第一个小的移到低端*/
while
(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first];
/*将比第一个大的移到高端*/
}
a[first] = key;
/*枢轴记录到位*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
}
int
main()
{
int
a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
Qsort(a, 0,
sizeof
(a) /
sizeof
(a[0]) - 1);
/*这里原文第三个参数要减1否则内存越界*/
for
(
int
i = 0; i <
sizeof
(a) /
sizeof
(a[0]); i++)
{
cout << a[i] <<
""
;
}
return
0;
}
堆排序
//整理节点time:O(lgn)
void minHeap(T *arry, int size, int element) {
int temp = element;
int lchild = temp * 2 + 1, rchild = lchild + 1;
while (rchild < size) //存在右子树;
{
if (arry[rchild] < arry[temp] && arry[lchild] < arry[temp])
return;
if ((arry[rchild] < arry[temp] && arry[lchild] > arry[temp])|| (arry[rchild] >arry[temp] && arry[lchild] > arry[temp]&&arry[rchild]<arry[lchild]))
{
swap(arry[lchild], arry[temp]);
temp = lchild;
}
else{
swap(arry[rchild], arry[temp]);
temp = rchild;
}
lchild = temp * 2 + 1, rchild = lchild + 1;
}
if (lchild < size &&arry[lchild] < arry[temp]) //只有左子树
swap(arry[lchild], arry[temp]);
return;
}
//堆排序time:O(nlgn)
template
<typenameT>
void
HeapSort(T*arry,
int
size)
{
int
i;
for
(i=size-1;i>=0;i--)
//从子树开始整理树
{
MinHeapify(arry,size,i);
}
while
(size>0)
//拆除树
{
swap(arry[size-1],arry[0]);
//将根(最小)与数组最末交换
size--;
//树大小减小
MinHeapify(arry,size,0);
//整理树
}
return
;
}