Java QuickSelect平均时间复杂度O(n)[如何?]

Java QuickSelect平均时间复杂度O(n)[如何?],java,time-complexity,quickselect,Java,Time Complexity,Quickselect,我正在学习QuickSelect查找第k个最小数。 我理解这个节目。 但我一直在思考QuickSelect的平均时间复杂度是O(n) 我用Java试过代码,效果很好。但我被时间的复杂性所困扰 public class KthSmallestNumberUsingQuickSelect { int findKthNumber(int arr[], int left, int right, int k ) { if(k > 0 && k <= r

我正在学习QuickSelect查找第k个最小数。 我理解这个节目。 但我一直在思考QuickSelect的平均时间复杂度是O(n)

我用Java试过代码,效果很好。但我被时间的复杂性所困扰

public class KthSmallestNumberUsingQuickSelect {

    int findKthNumber(int arr[], int left, int right, int k ) {
        if(k > 0 && k <= right - left + 1) {

            int pos = partition(arr,left,right);

            if(pos - left == k - 1)
                return arr[pos];

            if(pos - left > k - 1)
                return findKthNumber(arr, left, pos - 1, k);
            System.out.println(k - pos + left - 1);
            return findKthNumber(arr, pos + 1, right, k - pos + left - 1);
        }
        return Integer.MAX_VALUE;
    }

    int partition(int arr[], int left, int right) {
        int i = left ;
        int j;
        int x = arr[right];
        int temp = 0;

        for(j=left; j<right; j++ ) {
            if(arr[j] <= x) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;

                i++;
            }
        }
        temp = arr[i];
        arr[i] = x;
        arr[right] = temp;

        return i;
    }

    public static void main(String[] args) {
        KthSmallestNumberUsingQuickSelect kq = new KthSmallestNumberUsingQuickSelect();


        int arr[] =  {7,10,4,3,20,15};
        int k = 3;

        System.out.println(kq.findKthNumber(arr,0,arr.length-1, k));
    }
}
公共类KthSmallestNumberUsingQuickSelect{
int findKthNumber(int arr[],int left,int right,int k){
如果(k>0&&k k-1)
返回findKthNumber(arr,左侧,位置-1,k);
系统输出打印项次(k-位置+左-1);
返回findKthNumber(arr,位置+1,右侧,k-位置+左侧-1);
}
返回Integer.MAX_值;
}
整数分区(整数arr[],整数左,整数右){
int i=左;
int j;
int x=arr[右];
内部温度=0;

对于(j=left;j我认为你的问题不是特别的,你是在问大O符号和平均θ符号有什么区别

大O表示法描述了算法将使用的最大潜在复杂性

另一方面,Θ表示法是问题输入的所有可能组合的平均复杂度

还有一种表示最佳案例复杂性的ω(Ω)符号

public class KthSmallestNumberUsingQuickSelect {

    int findKthNumber(int arr[], int left, int right, int k ) {
        if(k > 0 && k <= right - left + 1) {

            int pos = partition(arr,left,right);

            if(pos - left == k - 1)
                return arr[pos];

            if(pos - left > k - 1)
                return findKthNumber(arr, left, pos - 1, k);
            System.out.println(k - pos + left - 1);
            return findKthNumber(arr, pos + 1, right, k - pos + left - 1);
        }
        return Integer.MAX_VALUE;
    }

    int partition(int arr[], int left, int right) {
        int i = left ;
        int j;
        int x = arr[right];
        int temp = 0;

        for(j=left; j<right; j++ ) {
            if(arr[j] <= x) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;

                i++;
            }
        }
        temp = arr[i];
        arr[i] = x;
        arr[right] = temp;

        return i;
    }

    public static void main(String[] args) {
        KthSmallestNumberUsingQuickSelect kq = new KthSmallestNumberUsingQuickSelect();


        int arr[] =  {7,10,4,3,20,15};
        int k = 3;

        System.out.println(kq.findKthNumber(arr,0,arr.length-1, k));
    }
}
快速选择算法遵循与快速排序相似的复杂性,您是对的,两者的大O表示法都是O(n^2),但在平均情况下,它们更好


如果您需要更具体的解释,为什么平均情况是线性的,请阅读下面的答案。

可能重复的感谢帮助:)