最近在学算法,学到快速排序心得就和你们分享一下。如下代码为c作演示,看不懂代码没关系,作参考就行了,主要为了明白快速排序思路。但愿能帮助到你们。
快速排序分为4个步骤算法
文字描述已讲述完,接下来草稿演示,也能够直接向下翻看代码,可能代码更有说服力
国足有6名队员从左到右身高排序球号为: 5号 9号 12号 3号 7号 8号ui
教练规定左边第一个最高的为队长(基准数):5号
教练要拆分两个队:指针
右边的球号要小于队长球号而且左边球号不能大于右边 找到后和左边交换位置code
左边的球号要大于队长球号而且左边球号不能大于右边排序
而后右边继续走找比5小的,最后走到了左队坐标位置,两个相遇相等的坐标让队长(基准数)放到相遇的位置。排队完成。最终获得的顺序为:递归
左队都是比队长(5号)球号小的,右边都是比队长大的get
接下来就要从队长开始继续拆分左、右边和上面教练说的同样直到不能拆分为止io
整个思路基本就这样,接下来代码实现:技术
#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; }
本文作为技术参考,也欢迎大神们指导和批评,但愿对你们有帮助。sort