快速排序与快速选择 (Java)

快速选择可以在nlogn的时间复杂度下得到一组无序数字的第k大,原理基于快速排序,每次以某个数字为中点分成的左右两段,左边都小于等于分割数,而右边都大于等于分割数,快速选择的求解速度要比全部排序后再取第k大快

/**
 * Created by tcgogogo on 16/8/18.
 */
class Solution {

    public void outPut(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + " ");
        }
        System.out.println();
    }

    public void swap(int[] nums, int i, int j) {
        if (i == j) {
            return;
        }
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

    public void quickSort(int[] nums, int left, int right) {
        if (left > right) {
            return;
        }
        int i = left, j = right;
        while (i < j) {
            while (i < j && nums[j] >= nums[left]) {
                j --;
            }
            while (i < j && nums[i] <= nums[left]) {
                i ++;
            }
            if(i < j) {
                swap(nums, i, j);
            }
        }
        swap(nums, left, i);
        quickSort(nums, left, i - 1);
        quickSort(nums, i + 1, right);
    }

    public int quickSelect(int[] nums, int left, int right, int k) {
        if (left > right) {
            return 0;
        }
        int i = left, j = right;
        while (i < j) {
            while (i < j && nums[j] >= nums[left]) {
                j --;
            }
            while (i < j && nums[i] <= nums[left]) {
                i ++;
            }
            swap(nums, i, j);
        }
        swap(nums, left, i);
        if(k == i - left + 1) {
            return nums[i];
        }
        else if(k < i - left + 1) {
            return quickSelect(nums, left, i - 1, k);
        }
        else {
            return quickSelect(nums, i + 1, right, k - (i - left + 1));
        }
    }
}
时间: 2024-08-03 02:40:03

快速排序与快速选择 (Java)的相关文章

快速排序及优化(Java实现)

普通快速排序 找一个基准值base,然后一趟排序后让base左边的数都小于base,base右边的数都大于等于base.再分为两个子数组的排序.如此递归下去. public class QuickSort { public static <T extends Comparable<? super T>> void sort(T[] arr) { sort(arr, 0, arr.length - 1); } public static <T extends Comparabl

快速排序算法(Java)

快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class PartitionSort{ public void p(int[] a){ //打印输出结果 for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } public int Parti

快速排序,一个爱情故事-java版

public static void myquicksort(int[] ages,int girl,int boy){ //这是一个站在数组两端,追求完美爱情的故事 //年龄不匹配的不要 //第0步 if(girl > boy){return;} int perfect = ages[girl]; int i = girl;//分身 int j = boy;//分身 int tmp = 0; //寻找的终止条件是男生的分身的位置和女生分身的位置相等 //第四步 while(i!=j) { //

随机化快速排序(Java实现)

Randomized quicksort(随机化快速排序) running time is independent of input ordering. no assumption about the input distribution.(无需对输入序列分布做任何假设) no specific input elicit the worst-case behavior.(没有特定输入引起最差的运行效率) worst-case determined only by a random -number

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

java选择排序和冒泡排序

public class Choose{ public static void main(String[] args){  int[] arr = {4,6,7,3,1,6};   Select a = new Select();   a.sort1(arr);   System.out.println("选择排序后:");   for(int i=0;i<arr.length;i++){    System.out.print(arr[i]);    }    a.sort2(

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考. <1>利用Arrays带有的排序方法快

Java面试题集(136-150)

摘要:这一部分主要是数据结构和算法相关的面试题目,虽然只有15道题目,但是包含的信息量还是很大的,很多题目背后的解题思路和算法是非常值得玩味的. 136.给出下面的二叉树先序.中序.后序遍历的序列? 答:先序序列:ABDEGHCF:中序序列:DBGEHACF:后序序列:DGHEBFCA. 补充:二叉树也称为二分树,它是树形结构的一种,其特点是每个结点至多有二棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒.二叉树的遍历序列按照访问根节点的顺序分为先序(先访问根节点,接下来先序访问左子树,再

Java面试题-1

Java面试题 Java面试题 1 1.面向对象的特征有哪些方面? 6 2.访问修饰符public,private,protected,以及不写(默认)时的区别? 7 3.String 是最基本的数据类型吗? 8 4.float f=3.4;是否正确? 8 5.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 8 6.Java有没有goto? 8 7.int和Integer有什么区别? 9 8.&和&&的区别? 11