快速排序的原理:
1.选取一个元素q,术语叫做主元2.循环数组a,将数组分割成 a[p...q-1] (小于主元部分) 和 a[q+1....r](大于主元部分)两部分,中间位置即选取主元q排序后的的位置。
3.循环迭代被分隔的数组即a[p...q-1] 和 a[q+1...r] 继续重复1,2步骤,这样数组就变成一个有序的数组。
伪代码如下:
其中partition的过程如下:
如图所示,其中浅阴影的部分是值不大于a[r]的值,深阴影的部分是大于a[r]的值,无阴影的元素是尚未进行排序的元素,r元素为主元。
a)所有元素都未进行排序。
b)数值2为小于主元的元素,需要进行交换,此刻i与j的值相同,只能与自己交换。
c)-d)都大于主元,被划入大于主元元素的那一部分中。
e)1为小于主元的元素,与8交换,并且小于主元的部分下标增加。
f)同上
g)-h)较大元素部分增加,并且循环结束。
i)主元被交换到两个数组的中间部分,至此完成了一次排序,后续再去各自递归调用被分好组的两部分,即大于主元的小于主元的数组再重复上述过程,
这样数组元素就进行了排序。
下面是java代码实现过程
public class QuickSort {
/**
* 快速排序的原理:
* 1.选取一个元素q,术语叫做主元
* 2.循环数组a,将数组分割成 a[p...q-1] 和 a[q+1....r]两部分,中间位置即选取主元q排序后的的位置。
* 3.循环迭代被分隔的数组即a[p...q-1] 和 a[q+1...r] 继续重复1,2步骤,这样数组就变成一个有序的数组。
*
*/
public void quickSort(int [] a,int p ,int r ){
if(p<r){
//找出主元排序后在数组中的下标
int q = partition(a,p,r);
//分割后继续排序
quickSort(a,p,q-1);
quickSort(a,q+1,r);
}
}
private int partition(int [] a,int p ,int r){
//选取主元,默认为最后一个元素
int x = a[r];
int i=p-1;
for(int j=p;j<r;j++){
if(a[j]<x){
i++;
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
int t = a[i+1];
a[i+1] = a[r];
a[r] = t;
return i+1;
}
public static void main(String[] args) {
QuickSort sort = new QuickSort();
int [] a = {2,8,6,1,3,10,4};
sort.quickSort(a, 0, a.length-1);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}