快速排序是对冒泡法排序的一种改进。
快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一 部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直 到所有要进行排序的数据变为有序为止。
更详细的解释:C语言快速排序算法及代码
视频:C语言数据结构与算法:第97讲,第九十六讲快速排序
快速排序----升序
/// <summary>
/// 快速排序--升序
/// </summary>
/// <param name="arr">数组</param>
/// <param name="low">数组的起始元素下标</param>
/// <param name="high">数组的结束元素下标</param>
void quickSort_Ascending(int* arr,int low,int high) {
int start = low;//设置起始下标
int end = high;//设置结束下标
if (low >= high)//当左边索引大于等于右边索引时,代表改数组已排序完毕
{
return;
}
int key = arr[low];//参考值
while (low < high) {
//结束的条件就是
// 1,找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序),如果没有,则跳出循环
// 2、 条件 low < high 用来判断数组右侧不存在元素大于参考值的情况时什么时候跳出循环
while (low < high && arr[high] >= key) {
high--;
}
//若上面循环是条件(low < high)不满足,则不会进入if语句中
//当数组右侧存在一个数比参考值小的时候,跳出了上面循环,
//将数值小的放在数组的左侧,大的放在数组的右侧
if (low < high) {
arr[low++] = arr[high];//arr[low++] = arr[low],low++
}
//和上面类似,当数组左侧存在一个值比参考值大的时候,跳出循环
while (low < high && arr[low] <= key) {
low++;
}
//跳出循环后,判断,然后进行数值交换
if (low < high) {
arr[high--] = arr[low];
}
}
arr[low] = key; //查找完一轮后key值归位, 不用比较一次就互换一次。此时key值将序列分成左右两部分
quickSort_Ascending(arr, start, low - 1);//快速查询左边部分
quickSort_Ascending(arr, low + 1, end);//快速查询右边部分
}
快速排序----降序
/// <summary>
/// 快速排序——降序
/// </summary>
/// <param name="arr"></param>
/// <param name="low"></param>
/// <param name="high"></param>
void quickSort_Descending(int* arr, int low, int high) {
//记录数组循环前的首尾两个下标
int start = low;
int end = high;
if (start >= end)
{
return;//返回,不再进行递归
}
//设置参考值
int key = arr[low];
while (low < high)
{
//条件 low < high 用来判断数组右侧不存在元素大于参考值的情况时什么时候跳出循环
//先判断元素右侧,若右侧数组中的元素出现大于参考值key,则跳出循环
while (low < high && arr[high] <= key)
{
high--;
}
//若上面循环是条件(low < high)不满足,则不会进入if语句中
//跳出循环之后将数组右侧大于参考值的值放入循环的左侧
if (low < high )
{
arr[low++] = arr[high];
}
//先判断元素左侧,若左侧数组中的元素出现小于参考值key,则跳出循环
while (low < high && arr[low] >= key)
{
low++;
}
//若上面循环是条件(low < high)不满足,则不会进入if语句中
//跳出循环之后将数组右侧小于于参考值的值放入循环的右侧
if (low < high)
{
arr[high--] = arr[low];
}
}
//循环之后,low为数组的中部的下标
arr[low] = key;
quickSort_Descending(arr, start, low - 1);//快速查询--左侧部分
quickSort_Descending(arr, low+1, end);//快速查询--右侧部分
}