The first principle:排序过程需要回退(不是一往无前的),不宜采用非递归算法。
快速排序的基本思想:
排序初始条件:排序集合初始化为这个待排序的顺序表表中所有元素。
选择排序集合的第一个元素作为轴值,
对排序集合进行一次划分。
对一次划分后的左半区进行快速排序。(不断缩小排序集合)
对一次划分后的右半区进行快速排序。
不断重复上述过程,直到到排序结束。
排序结束条件:排序集合的元素为1个或0个
一次划分结束条件:工作指针相遇。
快速排序之递归算法:
#include<stdio.h>
#include<string.h>
int Partition(char szChar[], int nLowerBound, int nUpperBound);
void QuickSort(char szChar[], int nLowerBound, int nUpperBound)
{
if (nLowerBound >= nUpperBound) //递归结束条件
{
return;
}
else
{ int nIndexOfAxisValue = Partition(szChar, nLowerBound, nUpperBound);
QuickSort(szChar, nLowerBound, nIndexOfAxisValue - 1);
QuickSort(szChar, nIndexOfAxisValue + 1, nUpperBound);
}
}
int Partition(char szChar[], int nLowerBound, int nUpperBound)
{
int i = nLowerBound, j = nUpperBound;
//int nAxis = szChar[nLowerBound];
int nTempValue = 0;
while (i != j)
{
//右侧扫描
while ((i < j)&&szChar[i] < szChar[j])
{
j--; //工作指针左移
}
if (i < j)
{
//交换元素
nTempValue = szChar[i];
szChar[i] = szChar[j];
szChar[j] = nTempValue;
i++; //工作指针右移
}
//左侧扫描
while ((i < j)&&szChar[i] < szChar[j])
{
i++; //工作指针右移
if (i < j)
{
//交换元素
nTempValue = szChar[i];
szChar[i] = szChar[j];
szChar[j] = nTempValue;
j--; //工作指针左移,准备重复右侧扫描
}
}
return i;//返回轴值最终位置
}
int main()
{
char szChar[] = "xiangshedfb";
printf("快速排序之前的顺序表:");
for (unsigned int i = 0; i < strlen(szChar); i++)
{
printf("%c ", szChar[i]);
}
printf("\n********\n", szChar);
QuickSort(szChar, 0, strlen("xiangshedfb") - 1);
printf("快速排序之后的顺序表:");
for (unsigned int j = 0; j < strlen(szChar); j++)
{
printf("%c ", szChar[j]);
}
return 0;
}<img src="https://img-blog.csdn.net/20141003132606678?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhbmdzaGVueWl5YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />