1. 快排
原理:在数组
A[l,r]
中任意选取一个元素作为分区点(pivot)。然后遍历该数组,将数组中大于pivot的元素置于其右边,小于pivot的元素置于其左边,pivot放在中间位置p处。此时数组被分为三部分,A[l...p-1],A[p+1...r],A[p]
。此时递归的对每个子序列进行相同的操作,直到数组元素只有一个为止。此时数组有序。
Java实现:
public static void quickSort(int arr[],int left,int right){
if(left >= right) return ;
int partition = partition(arr,left,right);
quickSort(arr,left,partition-1);
quickSort(arr,partition+1,right);
}
// 对数组分区
private static int partition(int arr[], int left, int right) {
int pivot = arr[right];
int i = left;
// 已处理的部分放在i的左边,未处理的放在i的右边
for (int j = left;j < right;j++){
if(arr[j] > pivot){
swap(arr[i],arr[j]);
i++;
}
}
swap(arr[i],arr[right]);
return i;
}
2. 查找第K大元素
原理:根据快排原理,每次选出pivot元素,数组都被分为了三部分,
A[l...p-1],A[p],A[p+1...r]
,如果K=p
A[p]即为第k大元素,若k<p
,说明第k大元素在左边的部分,此时应该在左边A[l...p-1]
中继续查找第k大元素,若k>p
,说明第k大元素在右边的部分,此时应该在左边A[p+1...r]
中继续查找第k大元素
Java实现:
public static void quickSort(int arr[],int left,int right,int k){
int partition = partition(arr,left,right);
if(partition > k){
quickSort(arr,left,partition-1,k);
}else if(partition < k){
quickSort(arr,partition+1,right,k);
} else {
System.out.println(arr[k]);
}
}
public static void getKElem(int arr[],int left,int right,int k){
quickSort(arr,left,right,k-1);
}