快速排序算法
在快速排序的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。
也可以用第一个元素当pivot值
左右指针轮回移动
选中间的元素当pivot
private void quickSort1(int[]a,int left,int right) {
int l=left;
int r=right;
int pivot=a[(l+r)/2];
int temp=0;
while (l<r) {
//从左边开始直到找到大于等于pivot的下标
while (a[l]<pivot) {
l++;
}
//从右边开始直到找到小于等于pivot的下标
while (a[r]>pivot) {
r--;
}
//如果l>=r就说明所有的小于pivot的元素都移到了左边所有大于pivot的元素都移到了右边
if (l>=r) {
break;
}
//交换标记的元素
temp=a[r];
a[r]=a[l];
a[l]=temp;
if (a[l]==pivot) {
r--;
}
if (a[r]==pivot) {
l++;
}
}
//否则会出现栈溢出的情况
if (l==r) {
l++;
r--;
}
//对左边的元素进行快速排序
if (left<r) {
quickSort(a, left, r);
}
//对右边的元素进行快速排序
if (right>l) {
quickSort(a, l, right);
}
}
选头元素当pivot
private void quickSort2(int[]a,int L,int R) {
//说明所有的小于pivot的元素都移到了左边所有大于pivot的元素都移到了右边
if (L>=R) {
return ;
}
int left=L,right=R;
//选头元素当pivot
int pivot=a[left];
while (left<right) {
while (left<right&&a[right]>=pivot) {
right--;
}
if (left<right) {
a[left]=a[right];
}
while (left<right&&a[left]<=pivot) {
left++;
}
if (left<right) {
a[right]=a[left];
}
if (left>=right) {
a[left]=pivot;
}
}
quickSort2(a, L, right-1);
quickSort2(a, right+1, R);
}
测试类
public class Kauisu {
public static void main(String[] args) {
int[]a=new int[1000];
for (int i = 0; i < a.length; i++) {
a[i]=(int)(Math.random()*1000);
}
Kauisu mm=new Kauisu();
mm.QuickSort1(a, 0, a.length-1);
mm.QuickSort2(a, 0, a.length-1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
···
···
}