您的位置:首页 > 编程语言 > C语言/C++

快速排序的C++实现

2010-08-05 12:22 351 查看
在当前无序区间R[a..b]中任取一个数据元素作为比较的"基准值"(不妨记为X),
用此基准将当前无序区间划分为左右两个较小的无序区间:
R[a..n- 1]和R[n+1..b],且:
左边的无序子区间中数据元素均小于等于基准元素,
右边的无序子区间中数据元素均大于等于基准元素,
而基准X则位于最终排序的位置n上,即R[a..n-1]≤X≤R[n+1..b](a≤n≤b),
当R[a..n-1]和R[n+1..b]均非空时,
分别对它们进行上述的划分过程,
直至所有无序子区中的数据元素均已排序为止。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Printf(int *nArray, int nBPos, int nEPos)
{
int nCnt = 0;
for (int i=nBPos; i<=nEPos; ++i)
{
printf("%6d ", nArray[i]);
if ( (++nCnt % 10) == 0)
{
printf("/n/n");
}
}
printf("/n/n");
}
int Parttion(int *nArray, int nBeginPos, int nEndPos)
{
int nI  = nBeginPos;
int nJ  = nEndPos;
int nBaseElent = nArray[nBeginPos];
for ( ; nI != nJ ;)
{
// 从右到左扫描,查找第一个小于nBaseElent的元素
while ( (nArray[nJ] >= nBaseElent) && ( nI < nJ ) )
{
nJ -= 1;
}
if ( nI < nJ )
{
int nTmp   = nArray[nI];
nArray[nI] = nArray[nJ];
nArray[nJ] = nTmp;
}
// 从当前位置开始从左到右扫描,查找第一个大于nBaseElent的元素
while ( (nArray[nI] <= nBaseElent ) && ( nI < nJ ) )
{
nI += 1;
}
if ( nI < nJ )
{
int nTmp   = nArray[nJ];
nArray[nJ] = nArray[nI];
nArray[nI] = nTmp;
nJ -= 1;
}
}
return nI;
}
void QuickSort(int *nArray, int nBeginPos, int nEndPos)
{
if ( nBeginPos < nEndPos )
{
int nBasePos = Parttion( nArray, nBeginPos, nEndPos);
QuickSort( nArray, nBeginPos, nBasePos-1);
QuickSort( nArray, nBasePos+1, nEndPos);
}
}
#define MAXLEN  20
int main()
{
::srand( (unsigned)::time( NULL ) );
int nArrayPtr[MAXLEN] = {0};
for ( int i=0; i<MAXLEN; ++i)
{
nArrayPtr[i] = ::rand();
}
int nBasePos = 0;
printf("Begin Sort : /r/n");
Printf(nArrayPtr,0, MAXLEN-1);
QuickSort(nArrayPtr,0,MAXLEN-1);
printf("End Sort : /r/n");
Printf(nArrayPtr,0, MAXLEN-1);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: