快速排序(QuickSort) 算法思路详解

51次阅读

共计 1496 个字符,预计需要花费 4 分钟才能阅读完成。

最近在学算法,学到快速排序心得就和大家分享一下。以下代码为 c 做演示,看不懂代码不要紧,做参考就好了,主要为了明白快速排序思路。希望能帮助到大家。
快速排序分为 4 个步骤

找一个基准数(参照数)
从右往左找比基准数小的数与左坐标交换
从左往右找比基准数大的数与右坐标交换
左、右坐标相遇时,基准数与相遇坐标交换

文字描述已讲述完,接下来草稿演示,也可以直接向下翻看代码,可能代码更有说服力
国足有 6 名队员从左到右身高排序球号为:5 号 9 号 12 号 3 号 7 号 8 号
教练规定左边第一个最高的为队长(基准数):5 号教练要拆分两个队:
右边的球号要小于队长球号并且左边球号不能大于右边 找到后和左边交换位置
找到了 3 号比 5 号小,与左队当前坐标交换位置 新顺序为:3 号 9 号 12 号 5 号 7 号 8 号 坐标定在第 4 个人
左边的球号要大于队长球号并且左边球号不能大于右边
找到了 9 号比 5 号大,与右队当前坐标交换位置 新顺序为:3 号 5 号 12 号 9 号 7 号 8 号 坐标定在第 2 个人
然后右边继续走找比 5 小的,最后走到了左队坐标位置,两个相遇相等的坐标让队长(基准数)放到相遇的位置。排队完成。最终得到的顺序为:
3 号 5 号 12 号 9 号 7 号 8 号
左队都是比队长(5 号)球号小的,右边都是比队长大的
接下来就要从队长开始继续拆分左、右边和上面教练说的一样直到不能拆分为止
整个思路基本就这样,接下来代码实现:
#include <stdio.h>
#include <stdlib.h>
int a[101],n;
/**
* 快速排序:
* 1. 以左边第一位作为基准数,
* 2. 先右边找一个比基准数小的数与左指针所在的位置进行交换
* 3. 从左边找一个比基准数大的数与右指针所在的位置进行交换
* 4. 相遇后则把基准数和左、右指针重合的位置进行交换
* 5. 重复 1 /2/3/ 4 操作
* 注意:
* 如果左坐标大于右坐标位置则无法计算,必须左坐标小于右坐标。
*/
void quicksort(int left, int right){
int i,j,base;
i = left;
j = right;

if (left>right) return ;
// 1. 第一步,定义基准数
base = a[left];

// 4. 左坐标不等于右坐标时继续迭代,等于则相遇
while(left != right){

// 2. 如果右边大于基准数则继续递减迭代至小于基准数停止
while(left<right && a[right]>=base)
right–;
// 2.1 与左指针所在位置进行交换
a[left] = a[right];

// 3. 如果左边小于基准数则继续递增迭代至大于基准数停止
while(left<right && a[left]<=base)
left++;
// 3.1 与右指针所在位置进行交换
a[right] = a[left];

}
// 4.1 左右坐标相遇替换基准数
a[left] = base;

// 5. 重复 1.2.3.4 递归
quicksort(i, left-1); // 重复基准数左边
quicksort(left+1, j);
return;
}
int main()
{
int i,j;
printf(“============= 快速排序 ==============\r\n”);
printf(“ 请输入数量:”);
scanf(“%d”, &n);
for (i=1; i<=n; i++){
scanf(“%d”, &a[i]);
}

quicksort(1, n);
printf(“ 快速排序结果:\r\n”);

for (i=1; i<=n; i++)
printf(“%d “, a[i]);

getchar(); getchar();
system(“pause”);
return 0;
}

本文做为技术参考,也欢迎大神们指导和批评,希望对大家有帮助。

正文完
 0