几种排序算法 (快速排序+堆排序)

快速排序
#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)
template<typename T>
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;
}


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页