最近在学算法,学到快速排序心得就和大家分享一下。以下代码为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;}本文做为技术参考,也欢迎大神们指导和批评,希望对大家有帮助。