快速排序#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;}
本文介绍了两种经典的排序算法:快速排序和堆排序的具体实现。快速排序通过选取枢轴进行分区,递归地对左右子数组进行排序。堆排序则先建立最大堆,再逐步调整并移除最大元素完成排序。
779

被折叠的 条评论
为什么被折叠?



