快速排序定义:
快速排序的基本思想是分治法,排序过程如下:在输入数组中随机选取一个元素作为中间值(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;}}
}