基本排序算法的实现(我的练习 快速排序有三种实现方式,值得关注)

    本人贴上以前的学数据结构的排序算法时的练习(数据结构与算法分析—C语言描述 ),给后给出了二分查找的算法。 其中结合三数中值分割法的快速排序和二分查找,以及加入内存映射就可以构造出比Borland的TStringList更快的CStringListEx,有兴趣的读者可以自己去实现它。 算法都是现成的算法,我把它们整合在了一起,以方面读者查阅,具体的算法原理和内容,请参考书籍或网络上的资料。里面的快速排序方面也是参照了操作系统中的快速排序方面的实现。

 

    我的EMAIL :wxy3064one@163.com

  

    (一) 排序算法练习 main.cpp (自己用VC写个控制台程序,把它加入就可以运行)

   ///
///                                                       
///                         排序算法                      
///                                                       
///                                                       
///
#include <stdio.h>
#include <stdlib.h>  
#include <string.h>
#include <time.h>

//N(m)表示N的m次方
namespace SORT_ALGORITHM
{
 template <typename T>
 void swap_t(T& a,T& b)
 {
  T c;
  c = a;
  a = b;
  b = c;
 }
 void printf_sort(int A[],int n,const char* alg_name,bool front=true)
 {
  char _name[256]={0};
  strcat(_name,alg_name);
  if (front)
   strcat(_name,"前数组分布:  ");
  else
   strcat(_name,"后数组分布:  ");
  printf(_name);
  for(int i=0;i<n-1;i++)
  {
   printf("%d,",A[i]);
  }
  printf("%d /n",A[n-1]);
 }
 /*
   插入排序:
       有N - 1趟排序组成,对于P = 1趟到P = N - 1趟,插入排序保证从位置0到位置P的元素为已排序状态.
   类型:内部排序
   复杂度: o(N(2))
 */
    //通过交换相邻元素进行排序的任何算法平均需要o(N(2))时间
 template <typename T>
 void InsertionSort(T A[],int N,int& cnt)
 {
  int j,p;
  T   tmp;
  for(p = 1; p < N; p++)
  {
   cnt++;
   tmp = A[p];
   for(j = p;j > 0 && A[j - 1] >tmp;j--)
   {
    A[j] = A[j - 1];
    cnt++;
   }
   A[j] = tmp;
  }
 }
 /*
   冒泡排序:
   类型:内部排序
   复杂度: o(N(2))
 */
 template <typename T>
 void BubbleSort(T A[],int N,int &cnt)
 {
  bool bFinished = false;
  for(int i = 0; i< N - 1 && !bFinished; i++)
  {
   bFinished = true;
   for(int j = N - 1;j>i; j--)
   {
    if (A[j] < A[j - 1])
    {
     cnt++;
     swap_t(A[j],A[j-1]);
     bFinished = false;
    }
   }
  }
 }
 /*
   希尔排序:
       也叫缩小增量排序.它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到
    只比较相邻元素的最后一趟排序为止.
   类型:内部排序
   复杂度: o(N(2))
 */
 template <typename T>
 void ShellSort(T A[],int N,int &cnt,bool useSedgewickInc=false){
  int i,j,Increment;
  T tmp;  
        if (!useSedgewickInc)
  {
   //Hibbard增量  奇数序列 o(N(3/2))
   for(Increment = N/2,Increment -= (Increment%2)?0:1;Increment >0;Increment /= 2)
   {
    //cnt++;
    for(i = Increment ; i< N; i++)
    {
     tmp = A[i];
     //cnt++;
     for(j=i;j>=Increment;j-=Increment)
     {
      cnt++;
      if (tmp < A[j - Increment])
       A[j] = A[j-Increment]; 
      else
       break;
     }
     A[j] = tmp;
    }
   }
  }
  else
  {
   //Sedgewick Hibbard增量  奇数序列 o(N(4/3))
   int sedgewick[] = {
   1073643521, 603906049, 268386305, 150958081, 67084289,
   37730305, 16764929, 9427969, 4188161, 2354689,
   1045505, 587521, 260609, 146305, 64769,
   36289, 16001, 8929, 3905, 2161,
   929, 505, 209, 109, 41,
   19, 5, 1, 0};
   int k = 0;
   int k_cnt = sizeof(sedgewick)/sizeof(int);

   for(k=0;k<k_cnt,sedgewick[k]>N;k++){cnt++;}

   for(Increment = sedgewick[k];k<k_cnt;Increment = sedgewick[++k])
   {
    //cnt++;
    for(i = Increment ; i< N; i++)
    {
     tmp = A[i];
     //cnt++;
     for(j=i;j>=Increment;j-=Increment)
     {
      cnt++;
      if (tmp < A[j - Increment])
       A[j] = A[j-Increment];
      else
       break;
     }
     A[j] = tmp;
    }
   }
  }
 }
 /*
   堆排序:
   类型:内部排序
   复杂度: o(NLogN)
 */

    #define LeftChild(i) (2 * i + 1)

 template <typename T>
 void PercDown(T A[],int i,int N,int& cnt)
 {
  int Child;
  T tmp;

  for(tmp = A[i];LeftChild(i) < N; i = Child)
  {
   cnt++;
   Child = LeftChild(i);
   if (Child != N - 1 && A[Child + 1] > A[Child])
    Child++;
   if (tmp < A[Child])
    A[i] = A[Child];
   else
    break;
  }
  A[i] = tmp;
 }
 template <typename T>
 void HeapSort(T A[],int N,int &cnt)
 {
  int i;
  for(i = N/2;i>=0;i--)/*BuildHeap o(N)*/
   PercDown(A,i,N,cnt);
  for(i = N - 1; i > 0; i--)/*DeleteMax O(NLogN)*/
  {
   swap_t(A[0],A[i]);
   PercDown(A,0,i,cnt);
  }
 }

 /*
   归并排序:
   类型:内部排序
   复杂度: o(NLogN)
   额外增加了内存,还涉及数组间的拷贝
 */
 template <typename T>
 void Merge(T A[],T B[],int Lp,int Rp,int Re,int &cnt)
 {
  int i,Le,NumElements,tmpPos;

  Le = Rp - 1;
  tmpPos = Lp;
  NumElements = Re - Lp + 1;
  
  while(Lp <= Le && Rp <= Re)
  {
   if (A[Lp] <= A[Rp])
    B[tmpPos++] = A[Lp++];
   else
    B[tmpPos++] = A[Rp++];
   cnt++;
  }

  while(Lp <= Le)
  {
   B[tmpPos++] = A[Lp++];
   cnt++;
  }

  while(Rp <= Re)
  {
   B[tmpPos++] = A[Rp++];
   cnt++;
  }
  for( i = 0; i < NumElements;i++,Re--)
  {
   A[Re] = B[Re];
   cnt++;
  }
 }

 template <typename T>
 void MSort(T A[],T B[],int L,int R,int &cnt)
 {
  int Center;
  if (L < R)
  {
   Center = (L + R) / 2;
   MSort(A,B,L,Center,cnt);
   MSort(A,B,Center+1,R,cnt);
   Merge(A,B,L,Center+1,R,cnt);
  }
 }

 template <typename T>
 void MergeSort(T A[],int N,int &cnt)
 {
  T* B;
  B = (T*)malloc(N*sizeof(T));
  if (B != NULL)
  {
   MSort(A,B,0,N-1,cnt);
   free(B);
  }else
   printf("No Space for tmp array!!!");
 }
 /*
   快速排序:
      算法由四步组成:
   1. 如果S中元素个数是0或1,则返回
   2. 取S中任一元素v,称之为枢纽元
   3. 将S-{v}分成两个不相交的集合:S1 = {x∈S - {v},x≦v}和S2 = {x∈S - {v},x≧v}
   4. 返回quicksort(S1)后,继随v,继而quicksort(S2)

   一种安全的方针是随机选取枢纽元.但随机数的生成非常昂贵,根本减少不了算法其余部分的平均运行时间
   推荐使用三数中值分割法
   可以构造快速选择方法: 先备份数组,增加一个序号参数k, k<=i时,分割左侧快速排序,否则右侧快速排序.完成之后,直接取数组序号为
                         k的值即可.
      最好:o(NLogN)  平均:o(NLogN)  最差o(N(2))
   类型:内部排序
   复杂度: o(NLogN)
 */

 template <typename T>
 T Partion(T A[],int Left,int Right,int &cnt)
 {
  int i,j = Left - 1;
     T s = A[--Right];
  for(i = Left;i<Right;i++)
  {
   if (A[i] < s)
   {
    j++;
    swap_t(A[i],A[j]);
   }
   cnt++;
  }
  j++;
  A[Right] = A[j];
  A[j] = s;
  return (T)j;
 }

 template <typename T>
 T RandomPartion(T A[],int Left,int Right,int &cnt)
 {
  int i = Left + rand() % (Right - Left - 1);
  swap_t(A[i],A[Right -1]);
  return Partion(A,Left,Right,cnt);
 }

 template <typename T>
 T Median3(T A[],int Left,int Right)
 {
  int Center = (Left + Right) / 2;

  if (A[Left] > A[Center])
   swap_t(A[Left],A[Center]);
  if (A[Left] > A[Right])
   swap_t(A[Left],A[Right]);
  if (A[Center] > A[Right])
   swap_t(A[Center],A[Right]);

  swap_t(A[Center],A[Right - 1]);/*Hide pivot*/
  return A[Right - 1];
 }

 template <typename T>
 void QuickSort(T A[],int Left,int Right,int& cnt,bool busedef=false)
 {
  int i,j;
  T Pivot;
  if (!busedef)
  {
   const int Cutoff = 3;
   if (Left + Cutoff <= Right)
   {
    Pivot = Median3(A,Left,Right);
    i = Left;
    j = Right - 1;
    while (1)
    {
     while(A[++i] < Pivot){cnt++;}
     while(A[--j] > Pivot){cnt++;}
     if (i < j)
      swap_t(A[i],A[j]);
     else
      break;
    }
    swap_t(A[i],A[Right - 1]); /*Restore pivot*/
    QuickSort(A,Left,i - 1,cnt);
    QuickSort(A,i + 1,Right,cnt);
   }else{
    InsertionSort(A+Left,Right - Left + 1,cnt);
   }
  }else{
   if (Left < Right - 1)
   {
    i = RandomPartion(A,Left,Right,cnt);
    QuickSort(A,Left,i,cnt);
    QuickSort(A,i+1,Right,cnt);
   }
  }
 }
    //
 // 大型结构排序的处理方法: 交换两个结构可能是非常昂贵的操作.
 //                         通过在结构中增加关键字,直接比较两结构体指针所指向的关键字来处理.
 //

 // 决策树(二叉树)用于证明下界的抽象概念
 // 定理:(1) 深度为d的二叉树最多有2(d)个叶子
 //      (2) 具有L片叶子的二叉树的深度至少是[logL]
 //      (3) 只使用元素间比较的任何排序算法最坏情况下至少需要[logN!]次比较
 //      (4) 只使用元素间比较的任何排序算法需要进行O(NlogN)次比较
 //          LogN! =  LogN + Log(N-1) + ... + Log1
 //                >= LogN + Log(N-1) + ... + LogN/2
 //                >= N/2Log(N/2)
 //                >= N/2LogN - N/2 = O(NLogN)
 // 一般定理: 如果存在P种不同的结果要区分,而问题是YES/NO的形式,那么通过任何算法求解该问题在某种
 //           情况下总需要[LogP]个问题.
}

using namespace SORT_ALGORITHM;
int main()
{
 printf("**************************排序算法综合****************************/n");
    int cnt = 0;
 //time_t first, second,t; 
 //double timedif;
 int n_insert_array[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    int nlen = sizeof(n_insert_array)/sizeof(int);
 printf_sort(n_insert_array,nlen,"排序",true);

 printf("/n");
 //time(&t);
    //first = time(NULL);
 InsertionSort<int>(n_insert_array,nlen,cnt);
 if (cnt >0)
 {
  printf("插入排序循环次数:%d /n",cnt);
  cnt = 0;
 }
 //second = time(NULL);
 //timedif = difftime(second,first)/60;
 //printf("现在的时间是:%s/n所用时间为:%f 秒/n",ctime(&t),timedif);
 printf_sort(n_insert_array,nlen,"插入排序",false);
 printf("/n");
   
 int n_bubble_array[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_bubble_array)/sizeof(int);
 BubbleSort<int>(n_bubble_array,nlen,cnt);
 if (cnt >0)
 {
  printf("冒泡排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_bubble_array,nlen,"冒泡排序",false);
 printf("/n");

 int n_shell_array[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_shell_array)/sizeof(int);
 ShellSort<int>(n_shell_array,nlen,cnt,true);
 if (cnt >0)
 {
  printf("希尔排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_shell_array,nlen,"希尔排序",false);
 printf("/n");

 int n_heap_array[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_heap_array)/sizeof(int);
 HeapSort<int>(n_heap_array,nlen,cnt);
 if (cnt >0)
 {
  printf("堆排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_heap_array,nlen,"堆排序",false);
 printf("/n");

 
 int n_merge_array[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_merge_array)/sizeof(int);
 MergeSort<int>(n_merge_array,nlen,cnt);
 if (cnt >0)
 {
  printf("归并排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_merge_array,nlen,"归并排序",false);
 printf("/n");


 int n_quick_array0[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_quick_array0)/sizeof(int);
 srand(time(NULL));
 QuickSort<int>(n_quick_array0,0,nlen,cnt,true);
 if (cnt >0)
 {
  printf("随机分割快速排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_quick_array0,nlen,"快速排序",false);
 printf("/n");

 int n_quick_array1[] = {1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
                     ,8,16,1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16
 };
    nlen = sizeof(n_quick_array1)/sizeof(int);
 QuickSort<int>(n_quick_array1,0,nlen-1,cnt);
 if (cnt >0)
 {
  printf("三数中值分割快速排序循环次数:%d /n",cnt);  
  cnt = 0;
 }
 printf_sort(n_quick_array1,nlen,"快速排序",false);
 printf("/n");
 printf("******************************************************************/n");
 return 0;
}

 

 (二) 二分查找

 

 template <typename T>
bool BinSearch(T* AList,int Low,int High,T value,int (*compare_func)(T,T),int &index)
{
 bool ret = false;
 int I,C,L = Low,R = High;
 while( L <= R )
 {
  I = (L + R) >> 1;
  C = (*compare_func)((T)(*(AList+I)),value);
  if (C < 0) L = I + 1;
  else{
   R = I - 1;
   if (C == 0)
   {
    ret = true;
    L = I;
    break;
   }
  }
 }
 index = L;
 return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值