<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
</head>

<body>

<div align="center">
  <center>
  <pre><b><font color="#FF0000" size="6">采用模板和回调函数的快速排序小程序</font></b></pre>
  </center>
</div>

<div align="left">
  <pre><b><font color="#FF0000" size="5">A.第一版</font></b></pre>
</div>
<div align="left">
  <pre><b>这个小程序是最初的版本。</b></pre>
</div>
<div align="left">
  <pre><b>1。 程序基本说明：学计算机的人应该都听说过“快速排序”吧？这个练习程序就是采用了模板和回调函数的小程序。</b></pre>
</div>
<div align="left">
  <pre><b>2。 程序思路：快速排序是一种排序的算法，既然是通用的算法就不应该局限于某种数据类型，而模板和自定义的回调函数就是为了实现算</b></pre>
</div>
<div align="left">
  <pre><b>	法的通用性。</b></pre>
</div>
<div align="left">
  <pre><b>3。 主要函数介绍：</b></pre>
</div>
<div align="left" style="width: 892; height: 102">
  <pre><b>	A. 排序的递归调用的函数，传进的数组的类型采用了模板，并传进了数组的起始，结束参数，最后一个参数是一个数组元素之间进行</b></pre>
  <pre><b>	大小比较的自定义的函数指针。</b></pre>
  <pre>	template &lt;class T&gt;
	void quickSort(T array[], int start, int end, bool (*pfun)(T , T));</pre>
  <blockquote>
    <pre><b>B. 这个函数就是取分界点的函数，由A的函数调用，依靠传入的自定义元素大小比较函数指针进行大小比较。</b></pre>
    <pre>template &lt;class T&gt;
int part(T [], int, int, bool (*pfun)(T , T));
</pre>
    <pre><b>C. 这个函数是一个应用的例子，它是针对我采用的数组为int * 类型下的大小比较函数。</b></pre>
    <pre>bool myComp(int *i, int *j)</pre>
    <pre><b>D. 这是个显示结果的辅助函数，最后一个参数也是自定义的将数组元素转为可显示字符的函数指针。另一个myTrans函数是一个实做的</b></pre>
    <pre><b>例子函数，针对int *[]数组的将int指针数组元素转为字符的函数。</b></pre>
    <pre>template &lt;class T&gt;
void showArray(T array[], int size, char* (*translate)(T));</pre>
    <pre>char* myTrans(int *);</pre>
    <pre>　</pre>
  </blockquote>
</div>
<div align="left">
  <pre><b>4。 不足之处：</b></pre>
</div>
<div align="left">
  <pre><b>	A. 应该可以写成一个类。</b></pre>
</div>
<div align="left">
  <pre><b>	B. 初始化函数应该也传入用户自定义的初始化数组元素的函数指针。</b></pre>
</div>
<pre>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
</pre>
<pre>using namespace std;</pre>
<pre>const ARRAYSIZE = 20;</pre>
<pre>bool myComp(int *, int *);
</pre>
<pre>char* myTrans(int *);</pre>
<pre>template &lt;class T&gt;
int part(T [], int, int, bool (*pfun)(T , T));</pre>
<pre>template &lt;class T&gt;
void quickSort(T array[], int start, int end, bool (*pfun)(T , T));</pre>
<pre>template &lt;class T&gt;
void sortArray(T array[], int size, bool (*pfun)(T , T));</pre>
<pre>template &lt;class T&gt;
void initialize(T array[], int size);</pre>
<pre>template &lt;class T&gt;
void uninitialize(T array[], int size);
</pre>
<pre>template &lt;class T&gt;
void showArray(T array[], int size, char* (*translate)(T));</pre>
<pre>template &lt;class T&gt;
void Swap(T &amp;i, T &amp; j);
</pre>
<pre>int main()
{</pre>
<pre>	int * array[ARRAYSIZE];
	srand(time(0));
	initialize(array, ARRAYSIZE);
	showArray(array, ARRAYSIZE, myTrans);
	sortArray(array, ARRAYSIZE, myComp);
	cout&lt;&lt;endl;
	cout&lt;&lt;endl;
	cout&lt;&lt;&quot;now i see&quot;&lt;&lt;endl;
	showArray(array, ARRAYSIZE, myTrans);
	uninitialize(array, ARRAYSIZE);
</pre>
<pre>	return 0;
}
</pre>
<pre>template &lt;class T&gt;
void Swap(T &amp;i, T &amp; j)
{
	T hold;
	hold = i;
	i = j;
	j = hold;
}
</pre>
<pre>template &lt;class T&gt;
void quickSort(T array[], int start, int end, bool (*pfun)(T , T))
{
	</pre>
<pre>	int mid;</pre>
<pre>	if (start &lt; end)
	{
		mid = part(array, start, end, pfun);</pre>
<pre>		quickSort(array, start, mid, pfun);
		quickSort(array, mid + 1,end, pfun);
	}
}
</pre>
<pre>template &lt;class T&gt;
void showArray(T array[], int size, char* (*translate)(T))
{
	for (int i=0; i &lt; size; i++)
	{
		cout&lt;&lt;&quot;array[&quot;&lt;&lt;i&lt;&lt;&quot;] = &quot;&lt;&lt;translate(array[i])&lt;&lt;(((i + 1)% 4==0)?&quot;\n&quot;:&quot;\t&quot;);
	}</pre>
<pre>}</pre>
<pre>bool myComp(int *i, int *j)
{
	return (*i &gt; *j);
}</pre>
<pre>char *myTrans(int *i)
{
	char *result =new char;
	itoa(*i, result, 10);
	return result;
}</pre>
<pre>template &lt;class T&gt;
void sortArray(T array[], int size, bool (*pfun)(T , T))
{
	quickSort(array, 0, size - 1, pfun);	
}
</pre>
<pre>template &lt;class T&gt;
void initialize(T array[], int size)
{	
	int j;
	for (int i=0; i &lt; size; i++)
	{
		int *p= new int;
		*p = i;
		array[i] = p;
	}
	for (i=0; i&lt; size; i++)
	{
		j = rand() % size;
		Swap(array[i], array[j]);
	}
}</pre>
<pre>template &lt;class T&gt;
void uninitialize(T array[], int size)
{
	for (int i=0; i&lt; size; i++)
	{
		delete array[i];
	}
}

</pre>
<pre>template &lt;class T&gt;
int part(T array[], int start, int end, bool (*pfun)(T , T))
{
	int result =start;
	int i= start, j = end;
	while (i&lt;j)
	{	
		while (pfun(array[j], array[result])&amp;&amp;j&gt;result)
		{			
			j--;
		}
		if (j &gt; result)
		{
			Swap(array[j], array[result]);
			result = j;
		}</pre>
<pre>		while (!pfun(array[i],array[result])&amp;&amp;i&lt;result)
		{
			i++;
		}
		if (i&lt; result)
		{
			Swap(array[i], array[result]);
			result = i;
		}	
	}
	return result;
}


<a href="picture/QuickSort.JPG"><img border="0" src="picture/QuickSort.JPG" width="665" height="433"></a>
</pre>
<pre>
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       
&nbsp; <a href="Morse.htm"><img src="picture/back.gif"    
style="border: medium none" width="32" height="35" alt="back.gif (341 bytes)"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
<a href="index.htm"><img src="picture/up.gif" style="border: medium none" width="35"
height="32" alt="up.gif (335 bytes)"></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="MyList.htm"><img src="picture/next.gif" style="border: medium none" width="32"   
height="35" alt="next.gif (337 bytes)"></a></p>

</body>

</html>
