算法思想:
快速排序算法思想基于分治法思想之上,存在分解、解决这两步。
- 分解:
数组A[p…r]被划分为子数组A[p…q-1]和 A[q+1…r], A[p…q-1]中的每个元素都小于等于A[q],A[q+1…r]中的每个元素都大于等于A[q]
q在划分时确定 - 解决:
通过递归调用快速排序算法,对子数组 A[q+1…r]和A[p…q-1]进行排序
算法伪码:
QUICKSORT(A,p,r)
if p<r then
q=PARTITIION(A,low,high)
QUICKSORT(A,low,p-1)
QUICKSORT(A,p+1,high)
Key subroutine: PARTITION(A, low, high)
java语言代码:
挖坑法实现 PARTITION(A, low, high) :找坑位,填坑
仅适用于可双向遍历的顺序序列,不适用于单向检索的链表
import java.util.Arrays;
public class Quick {
/* pivot每次为数组初位置
public static int partition(int a[],int low,int high) {
int pivot=a[low];
while (low<high){
//初始头位置的数已经给pivot,从后往前找第一个小于pivot的位置,把小于pivot的数赋给给low位置
while (low<high && a[high]>=pivot){
high--;
}
a[low]=a[high];
while (low<high && a[low]<=pivot){
low++;
}
a[high]=a[low];
}
a[low]=pivot;
return low;
}
public static void quicksort(int surArr[],int low,int high){
int pivotloc;
if(low<high){
pivotloc=partition( surArr , low, high);
quicksort(surArr,low,pivotloc-1);
quicksort(surArr,pivotloc+1,high );
}
}
public static void main(String[]agrs){
int arr[]=new int[]{8,2,4,9,3,6};
System.out.println(Arrays.toString(arr));
int len=arr.length;
quicksort(arr,0,len-1);
System.out.println(Arrays.toString(arr));
}
}
前后指针法实现 PARTITION(A, low, high) :
在没找到大于pivot值前,i永远紧跟j;遇到大的两者之间机会拉开差距,中间差的肯定是连续的大于pivot的值;当再次遇到小于key的值时,交换两个下标对应的值就好了。
可适用于链表进行排序
import java.util.Arrays;
public class Quick {
public static int partition(int a[],int low,int high) {
int pivot=a[high];
int i=low-1;
int j=low;
for(;j<high;j++){
if(a[j]<=pivot){
i++;
exchange(a,i,j);
}
}
i++;
exchange(a,i,high);
return i;
}
//交换数组中a,b位置上的数
public static void exchange(int arr[],int a,int b){
int temp;
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void quicksort(int surArr[],int low,int high){
int pivotloc;
if(low<high){
pivotloc=partition( surArr , low, high);
quicksort(surArr,low,pivotloc-1);
quicksort(surArr,pivotloc+1,high );
}
}
public static void main(String[]agrs){
int arr[]=new int[]{8,2,4,9,3,6};
System.out.println(Arrays.toString(arr));
int len=arr.length;
quicksort(arr,0,len-1);
System.out.println(Arrays.toString(arr));
}
}