本人贴上以前的学数据结构的排序算法时的练习(数据结构与算法分析—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;
}