快速排序是基于分治法的重要排序算法,按照记录的值的对序列进行划分,具体步骤为
1:初始化
取第一个记录(值)作为基准,设置两个参数i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置,也就是本次划分的区间(第一个值记为i,最后一个值记为j,按照中间位置划分,一分为2)
2:右侧扫描过程
将基准记录(i值,开始为第一个值)与j指向的记录进行比较,如果j指向的记录的值大,则j向左移动一个位置j--,重复右侧扫描过程(继续将i与j--进行比较),直到右侧的记录的值小(j--对应的值比i小),将j对应的值与i对应的值进行交换,进行左侧扫描。
3:左侧扫描过程
将i指向的记录与j指向的记录进行比较,如果i指向的记录小,则i右移一个位置i++,重复左侧扫描过程,直到i指向的记录大于j指向的记录,进行交换,在进行右侧划分
4:直到i==j,第一次划分完成,在递归进行右侧扫描和左侧扫描
初始状态: 46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7
i = 0 j = 7
15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1
i = 1 j = 7
15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2
i = 2 j = 7
15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6
i = 2 j = 6
15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5
i = 2 j = 5
15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3
i = 3 j = 5
15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4
i = 3 j = 4
15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3
i = j = 3
第一次划分完成
[15 30 17] 56 [90 95 92]
在将左侧的进行上述步骤,右侧的进行上述步骤
15 17 30 56 90 92 95
完成快速排序
int Partation(int r[],int first,int end)//一次划分的函数
{
int i=first,j=end;
while(i<j)//i==j作为一次划分结束的条件
{
while(r[i]<r[j]) j--;//右侧侧扫描,满足条件,一直进行右侧侧扫描
if(i<j)//不满足条件则进行交换,且i右移,进行左侧扫描
{
r[i]=r[j];
r[j]=r[i];
i++;
}
while(r[i]<r[j]) i++;//满足条件则进行左侧扫描
if(i<j)//不满足则交换位置,j左移,进行右侧扫描
{
r[i]=r[j];
r[j]=r[i];
j--;
}
}
return i;//记录中心轴的最终位置
}
void QuickSort(int r[],int first,int end)
{
int p;
if(first<end){//first=end为递归跳出的条件
p=Partation(r,first,end);//p为中间位置
QuickSort(r,first,p-1);//递归进行左侧扫描,右侧扫描
QuickSort(r,p+1,end);
}