1.排序思路
快速排序是由冒泡排序改进而得,它的基本思想是:在待排序的n个元素中,任取一个元素(通常第一个)作为基准,把该元素放入适当位置后,数据序列被此元素划分为两个部分,把关键字小于该元素的元素放在前一部分,把关键字大于该元素的元素放在后一部分,并把该元素排在这两部分中间(称为该元素归位),这个过程叫做一趟快速排序。之后对两个子部分用递归的方法继续划分。
具体做法(以第一个元素为基准为例):
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
2.Java实现
//快速排序,以数组第一个元素为基准
public static void quickSort1(int[] a,int low,int high){
int i=low;
int j=high;
if(low<high){//因为后面要递归调用quickSort1方法,这是递归的终止条件,这一句必不可少!
int tmp=a[low];//注意tmp的位置,不能在if语句外定义!
//循环结束的条件为i==j
while(i!=j){
while(i<j && a[j]>=tmp)
j--;
if(i<j)
a[i]=a[j];
while(i<j && a[i]<=tmp)
i++;
if(i<j)
a[j]=a[i];
}
a[i]=tmp;
quickSort1(a,low,i-1);
quickSort1(a,i+1,high);
}
}
//快速排序,以数组中间元素为基准
public static void quickSort2(int[] a,int low,int high){
int i = low;
int j = high;
if(low<high){
int mid = (low+high)/2;
int tmp = 0;
//循环结束条件仍为i==j
while(i!=j){
while(i<j && a[j]>a[mid])//注意必须是a[j]>a[mid],不能有等于号
j--;
while(i<j && a[i]<a[mid])
i++;
if(i<j){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
quickSort2(a,low,i-1);
quickSort2(a,i+1,high);
}
}
3.算法分析
时间复杂度:最好情况O(nlog2n),最坏情况O(n2),平均情况O(nlog2n)。
空间复杂度:O(log2n)。
快速序是不稳定的。