活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
评价指标:
分类:
1.一开始第一个元素即默认为基准,但也是low
2.基准左面的都比基准小,基准右侧都比基准大,因此两侧扫描的时候只有符合条件的才会换过去,相等的就是不动,所以是一个不稳定的算法。
3.当low>=high就换,而且基准是和low换
#include
int Partition(int* arr, int low, int high)
{
//一次划分
int tmp = arr[low];//基准
while (low < high)
{
//(1)从后往前找比基准小的数字
while (low<high && arr[high]>tmp)
{
high--;
}
if (low < high)
{
arr[low] = arr[high];
}
//(2)从前往后找比基准大的数字
while (low < high && arr[low] <= tmp)
{
low++;
}
if (low < high)
{
arr[high] = arr[low];
}
}
arr[low] = tmp;
return low;
}
void Quick(int* arr, int low, int high)
{
int par = Partition(arr,low, high);
if (low < par - 1)//左边数据超过一个
{
Quick(arr, low, par - 1);
}
if (par + 1 < high)//右边数据超过一个
{
Quick(arr, par + 1, high);
}
}
void QuickSort(int* arr, int len)
{
Quick(arr, 0, len - 1);//参数一致
}
void Show(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
代码思路总结:
从后往前找比基准小的数据,往前挪
从前往后找比基准大的数据,往后挪
重复第一步和第二步。
快速排序是所有内部排序算法中平均性能最优的排序算法