快排算法比较基础,注意交换以及推进的策略(从后方找比标记值小的,从前方找比标记值大的)。每次把扫描的数组分成两份,递归下去就得到排序的数组。
#include <iostream>
#include <time.h>
//tdw
using namespace std;
int adata[100] = {0};//测试数据
void QuickSort(int nfirst, int nlast)//快排,nfirst-数组起始的索引,也是标记值。nlast-结束的数组索引
{
if (nfirst >= nlast)
return;
int indexmark = nfirst;//标记的索引
int i = nlast;//首先比较的是最后一个值
bool bfindbig = true;//寻找比标记大的值,不交换
int ncount = nlast - nfirst;//共需要比较的次数
while (ncount-- > 0)
{
if ((bfindbig && adata[i] < adata[indexmark]) || (!bfindbig && adata[i] > adata[indexmark]))//一旦不满足前边比标记值小或者后边的比标记值大,就交换,
{//(bfindbig && adata[i] < adata[indexmark]) 寻找比标记大的值,结果比标记值小,需要交换
//(!bfindbig && adata[i] > adata[indexmark]) 寻找比标记值小的值,结果比标记值大,需要交换
swap(adata[i], adata[indexmark]);
swap(i, indexmark);
bfindbig = !bfindbig;//交换搜索顺序 bfindbig == true 从后边搜索
}
bfindbig ? --i : ++i;
}
QuickSort(nfirst, indexmark - 1);
QuickSort(indexmark + 1, nlast);
}
int main()
{
srand(time(0));
for (int i = 0;i < 100;++i)
{
adata[i] = i+1;
}
for (int i = 0; i < 100;++i)
{
int temp = rand() % 100;
swap(adata[i], adata[temp]);//随机打乱
}
QuickSort(0,99);
for (int i = 0; i < 100;++i)
{
cout << adata[i] << " ";
}
return 0;
}