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

快速排序
#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 ;
}


猜你喜欢

转载自blog.csdn.net/liumoude6/article/details/79979688