算法之从零开始——排序
一、 快速排序
快排几乎是应届生面试种算法方面必问的,不是问你实现的方法,就是叫你在纸上写实现的代码。
快排采用的思想是分治思想,例如这个博客说的一样https://www.cnblogs.com/codeskiller/p/6360870.html
一、算法概述/思路
快速排序一般基于递归实现。其思路是这样的:
1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴”(pivot)。
2.基于这个值,将数组分为两部分,较小的分在左边,较大的分在右边。
3.可以肯定,如此一轮下来,这个枢轴的位置一定在最终位置上。
4.对两个子数组分别重复上述过程(递归),直到每个数组只有一个元素。
5.排序完成。
举例:
一个需要排序的数组
2 0 3 6 4 5 1
然后我们有2个指针,一个为first指向第0位,一个为last指向最后一位。
我们选择第一位为“枢轴”,称为key。所以key=2。
然后从last指针起 (最右边起),选择小于key值的(1),复制放到first指向的位置也就是第0位,first、last指针都没有进行位移,现在结果就成了
1 0 3 6 4 5 1
然后从first指针起(最左边起),选择大于key值的(3),复制放到last指向的位置也就是第6位。因为第0位的1和第1位的0不符合,first指针就向右边移动,first指针为2,last为6.结果就成了
1 0 3 6 4 5 3
接下来,继续,从last指针起(3),选择小于key值的(3),由于都不符合,last指针就向左边移动一直移动一直到和first重叠,结果就成了
1 0 3(3) 6 4 5 3
first和last重合的这时,就完成了递归循环的一组,把重合的这一位赋值为key。就变成了
1 0 2 6 4 5 3
此时就可以进行递归了,以2为中心分为左右两组继续上面的步骤。
递归使用只要有退出的条件就行了,那自然是”first和last重合”。
二、代码实例
#include<stdio.h> void Qsort(int a[], int low, int high)//传入的是要排序数组的 { if(low >= high)/*递归的退出条件*/ { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ while(first < last) { while(first < last && a[last] >= key) { --last; } a[first] = a[last];/*将比key小的移到低端*/ while(first < last && a[first] <= key) { ++first; } a[last] = a[first];/*将比key大的移到高端*/ } a[first] = key;/*枢轴记录到位*/ Qsort(a, low, first-1);/*递归左边的数组*/ Qsort(a, first+1, high);/*递归右边的数组*/ } int main() { int a[10]={2,0,3,7,6,4,5,9,8,1}; QSort(a,0,9); int n; for(n=0;n<10;n++) { printf("%d %d\n",n,a[n]); } }