快速排序是内部排序的一种,即数据保存在内存中,而非文件中。
基本思想是以一个基准值(通常选第一个数据),通过一次扫描和移动数据,让基准值右边所有的数据(无序)都比基准值大,左边的数据(无序)都比基准值小。然后再用同样的方法扫描和移动两边的数据,直到最后2个数据为基本单位,按大小排列,最终完成整个数据序列的排序。
以{3, 4, 2, 1, 6, 5, 9, 8, 7, 0}为例子。
第一次扫描:扫描范围(0,9),基准值为3,i=0,j=9,从右往左搜第一个比基准值大的数据,找到后,从左往右搜第一个比基准值小的数据,交换它们,然后继续做同样的搜索和交换直到i和j碰头(即要求j>i),表示第一次扫描结束,交换基准值单元和大于基准值的A[j]。然后以基准值单元为界限,递归处理基准值左、右两边的数据。
快速排序比冒泡排序难理解,但是效率确实高很多。
void hjd_quick_sort(int arraysort[], int nSt, int nEnd){
if (nSt < nEnd)
{
int ni = nSt, nj = nEnd, nMid = nSt;
int nSTD = arraysort[nSt]; //基准值
while (ni < nj)
{
if (arraysort[nj] < nSTD)
{
if (arraysort[ni] > nSTD)
{
int nTmp = arraysort[ni];
arraysort[ni] = arraysort[nj];
arraysort[nj] = nTmp;
ni++;
nj--;
}
else
{
ni++;
}
}
else
{
nj--;
}
}
//when ni meets nj, stop this round of search and swap Array[nSt] and Array[nj]
int nTmp = arraysort[nj];
arraysort[nj] = arraysort[nSt];
arraysort[nSt] = nTmp;
nMid = nj;
hjd_quick_sort(arraysort, nSt, nMid - 1);
hjd_quick_sort(arraysort, nMid + 1, nEnd);
}
}