今天说的是快速排序,这个也是面试经常考到的,所以大家应当格外的注意。
还是先说思想,快速排序:选取序列的第一个元素(或任意元素)作为标兵,在序列左边和右边两端分别设置一个指针(数组的话,就是数组下标)。首先,从序列的右端开始扫描,如果右端的第一个元素比标兵小,那么将改元素的值填充到左边指向的位置,并将指针向左移动一个;然后指针从左端向右开始扫描,如果左端元素比标兵大的话,将改元素的值填充到右边指针所指向的值;之后反复移动,直到两个指针外走到同一个位置,将标兵的值填充到该位置。
最后就是递归调用,分别处理标兵位置左边和右边的序列。
下面的Python的代码:
def kuaisu (a,l,r):
i=l
j=r
if i>j or i==j :
return
key = a[I] #必须写在if之后,防止递归调用时i的下标溢出
while i < j:
while a[j]>=key and i<j:
j-=1
if i<j:
a[i]=a[j]
i+=1
while a[i]<=key and i<j:
i+=1
if i<j:
a[j]=a[i]
j-=1
a[i]=key
kuaisu(a, l, i - 1)
kuaisu(a, i+1, r)
return a
Java的代码如下:
static int [] kuaisu (int [] a,int l ,int r ) {
int i=l;
int j=r;
if (i>=j)
return a;
int key =a[i];
while (i<j) {
while ((i<j) && (a[j]>=key))
j--;
if (i<j)
{ a[i]=a[j];
i++;
}
while ((i<j) && (a[i]<=key))
{
i++;
}
if (i<j) {
a[j]=a[i];
j--;
}
}
a[i]=key;
// System.out.println(key);
kuaisu(a,l,i-1);
kuaisu(a,i+1,r);
return a;
}