快速排序是现在计算机中排序算法相对比较快的一种算法,在各类语言中的排序算法大都是快速排序算法
现在我们来讲解一下快速排序的原理及其实现:
快速排序最主要的思想就是,找到一个基准点,然后把大于这个基准点的数放在后面,小于基准点的数放在前面然后根据这个基准点的位置进行递归分别处理前面后后面的数组完成整个递归的过程。大体思路就是这样。
简单明了上代码
//快速排序 //改变基准可以改变快排的速度
public static void quickSort(int[] arr,int l,int r) {
if(l>r) {
return;
}
int p = partition1(arr,l,r);
quickSort(arr,l,p-1);
quickSort(arr,p+1,r);
}
private static int partition1(int[] arr, int l, int r) {
int v = arr[l];
int i = l+1,j=r;
while(true) {
while(i<=r&&arr[i]<v) i++;
while(j>=l+1&&arr[j]>v) j--;
if(i>=j) break;
int temp =arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
int temp =arr[l];
arr[l]=arr[j];
arr[j]=temp;
return j;
}
在这个算法中还有一些改进的地方,当你在选择基准点的时候如果每次都选择第一个,而且数组又是相对有序的话,那么这个算法的时间复杂度就会降到O(n2),所以在选择基准点的时候我们应该随机的选择基准点,还有就是在进行左右分别处理的时候我们其实可以把等于基准点的数提取处理,不在进行递归处理改进代码如下:
public static void devQuickSort(int[] arr,int l,int r) {
if(l>r) {
return;
}
int v = arr[l];
int lt = l;
int gt = r+1;
int i =l+1;
while(i<gt) {
if(arr[i]>v) {
int temp =arr[i];
arr[i]=arr[gt-1];
arr[gt-1]=temp;
gt--;
}else if(arr[i]<v) {
int temp =arr[i];
arr[i]=arr[lt+1];
arr[lt+1]=temp;
lt++;
i++;
}
else {
i++;
}
}
int temp =arr[l];
arr[l]=arr[lt];
arr[lt]=temp;
devQuickSort(arr,l,lt-1);
devQuickSort(arr,gt,r);
}