快速排序定义:
快速排序的基本思想是分治法,排序过程如下:在输入数组中随机选取一个元素作为中间值(pivot),然后对数组进行分区(partition),使所有比中间值小的数据移到数组的左边,所有比中间值大的数据移到数组的右边。接下来对中间值左右两侧的子数组用相同的步骤排序,直到子数组中只有一个数字为止。
源代码:
class Solution {
public int[] sortArray(int[] nums){
quicksort(nums,0,nums.length - 1);
return nums;
}
private void quicksort(int[] nums,int start,int end){
if(end > start){
int pivot = partition(nums,start,end);
quicksort(nums,start,pivot-1);
quicksort(nums,pivot+1,end);
}
}
private int partition(int[] nums,int start,int end){
int small = start - 1;
for(int i = start;i < end;i++){
if(nums[i] < nums[end]){
small++;
swap(nums,i,small);
}
}
small++;
swap(nums,small,end);
return small;
}
private void swap(int[] nums,int index1,int index2){
if(index1 != index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
}
面试题76:
问题:
找出数组中第k大的数字
解决方案:
在长度为n的排序数组中,那么第k大的数字就是下标为n-k。使用partition对数组分区,如果分区后,partition选定的中间值的下标刚好等于n-k,那么该中间值就是第k大的数字。如果选定中间值的下标小于n-k,那么需要接着对该中间值右边的子数组继续进行分区,以此循环直到找到选定中间值的下标等于n-k为止。如果选定中间值的下标大于n-k,那么需要接着对该中间值左边的子数组继续进行分区,以此循环直到找到选定中间值的下标等于n-k为止。
源代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
int target = nums.length - k;
int start = 0;
int end = nums.length - 1;
int index = partition(nums,start,end);
while(index != target){
if(index < target){
start = index + 1;
}else{
end = index - 1;
}
index = partition(nums,start,end);
}
return
}
private int partition(int[] nums,int start,int end){
int small = start - 1;
for(int i = start;i < end;i++){
if(nums[i] < nums[end]){
small++;
swap(nums,i,small);
}
}
small++;
swap(nums,small,end);
return small;
}
private void swap(int[] nums,int index1,int index2){
if(index1 != index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
}