快速排序介绍
快速排序是通过一趟排序将要排序的数据分割成独立的两部分,把数组中的第一个数作为中间值,使左边一部分的所有数据都比这个中间值小,右边一部分的所有数据都比这个中间值大,然后再按这种方法对这两部分数据分别进行快速排序,从而使整个数据变成有序序列。
代码解析
1.将数组分为两部分,左边部分小于中间值,右边部分大于中间值
int Partition(int* br, int left, int right)//将数组分为两部分的函数
{
assert(br != nullptr);//对数组判空
int i = left, j = right;//设置左下标和右下标
int tmp = br[i];//设置中间值
while (i < j)
{
while (i<j && br[j]>tmp)--j;//在右下标大于左下标的情况下,如果右边的值大于中间值,右下标的值自减
if (i < j)br[i] = br[j];//在右下标大于左下标的情况下,如果右边的值小于中间值,把右边的值赋给i下标的值
while (i<j && br[i]<=tmp)++i;//同理
if (i < j)br[j] = br[i];
}
br[i] = tmp;//当左下标等于右下标时,把中间值赋给它
return i;//返回左下标
}
2.将左边部分的值和右边部分的值按照上面方法继续排序,从而使得左右两边部分的值有序
void QuickPass(int* br, int left, int right)//使左右两边部分的值有序的函数
{
assert(br != nullptr);//判空
if (left < right)//在右下标大于左下标的情况下
{
int pos = Partition(br, left, right);//调用上面1函数确定中间值位置
QuickPass(br, left, pos-1);//调用函数本身使得左边的值有序
QuickPass(br, pos+1, right);//调用函数本身使得右边的值有序
}
}
3.调用上述函数使得整个数组有序排列
void QuickSort(int* br, int n)//快速排序函数
{
assert(br != nullptr);//判空
QuickPass(br, 0, n - 1);//调用2函数
}
4.将数组中的数据有序打印
void Print_Ar(int* br, int n)//打印函数
{
assert(br != nullptr);//判空
for (int i = 0; i < n; i++)//for循环打印数组
{
printf("%5d", br[i]);
}
printf("\n");
}
5.主函数 //给出一组数据,调用上述函数使之有序排列并打印
int main()
{
int ar[] = { 12,4,57,8,99,9,90,76,57,63,43 };//给出一组数据ar
int n = sizeof(ar) / sizeof(ar[0]);//计算数组的长度
QuickSort(ar, n);//调用快速排序函数
Print_Ar(ar, n);//调用打印函数
return 0;
}