快速排序是所有面试中手写代码问题中频率最高的,没有之一
需要写的很熟练,值得注意的是快速排序并不是稳定的
partition函数是重点,有的时候会拿出来单独使用,比如求最大的几个数
下面是代码
#include <iostream>
using namespace std;
int a[] = { 5,13,6,24,2,8,19,27,6,12,1,17 };
void swap(int &s,int &r)
{
int t = r;
r = s;
s = t;
}
int partition(int s, int r)
{
int p = s;
int q = r+1; //这个+1很关键,因为后面的--q
int key = a[p];
while (1)
{
while (a[++p] < key && p < q); //从头查找第一个大于key的数
while (a[--q] > key); //从尾查找第一个小于key的数
if (p >= q) //如果尾指针小于头指针,结束
break;
swap(a[p],a[q]);
}
swap(a[s],a[q]); //把key放到分界点
return q;
}
void quicksort(int s,int r)
{
if (s < r)
{
int t = partition(s,r);
quicksort(s,t-1);
quicksort(t + 1, r);
}
}
void main()
{
int s=0, r=11;
quicksort(s, r);
}