Esempio n. 1
0
/*
 *  QuickSelect
 *  A average O(n) algorithm to select the kth element
 *  in array
 */
void QuickSelect(int* A, int p, int r, int k)
{
    int q;
    if (p < r)
    {
        q = Random_Partition(A, p, r);
        if (q == k)
            return;
        if (q < k)
            QuickSelect(A, q+1, r, k);
        else
            QuickSelect(A, p, q-1, k);
    }
}
Esempio n. 2
0
void
QuickSelect( Etype A[ ], int Low, int High, int k )
{
    if( Low + Cutoff > High )
        InsertionSort( &A[ Low ], High - Low + 1 );
    else
    {
            // Sort Low, Middle, High
        int Middle = ( Low + High ) / 2;

        if( A[ Middle ] < A[ Low ] )
            Swap( A[ Low ], A[ Middle ] );
        if( A[ High ] < A[ Low ] )
            Swap( A[ Low ], A[ High ] );
        if( A[ High ] < A[ Middle ] )
            Swap( A[ Middle ], A[ High ] );

            // Place pivot at Position High-1
        Etype Pivot = A[ Middle ];
	Swap( A[ Middle ], A[ High - 1 ] );

            // Begin partitioning
        int i, j;
        for( i = Low, j = High - 1; ; )
        {
            while( A[ ++i ] < Pivot )
                ;
            while( Pivot < A[ --j ] )
                ;
            if( i < j )
                Swap( A[ i ], A[ j ] );
            else
                break;
        }

            // Restore pivot
        Swap( A[ i ], A[ High - 1 ] );

            // Recurse: only this part changes
        if( k < i )
            QuickSelect( A, Low, i - 1, k );
        else if( k > i )
            QuickSelect( A, i + 1, High, k );
    }
}
Esempio n. 3
0
int main(void) {
	int n,k,i;
	scanf("%d %d",&n,&k);
	int a[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	printf("%d\n",QuickSelect(a,n,k));
	return 0;
}
Esempio n. 4
0
int QuickSelect(int A[],int n,int k){
	int r=0,si=0,li=0,A1[n],A2[n];
	int pivot = A[r],i;
	for(i=0;i<n;i++){
		if(A[i] < pivot) {
			A1[si++] = A[i];
		}
		else if(A[i] > pivot) {
			A2[li++] = A[i];
		}
	}
	if(k<=si){
		return QuickSelect(A1,si,k);
	}
	else if(k > (n-li)){
		return QuickSelect(A2,li,k-(n-li));
	}
	else
		return pivot;

}
Esempio n. 5
0
int main()
{
    int i;
//    QuickSort(A, 0, 9);
    QuickSelect(A, 0, 9, 3);
    for (i=0; i<10; i++)
    {
        printf("%d,", A[i]);
    }
    printf("\n");

    return 0;
}
Esempio n. 6
0
int QuickSelect(std::vector<int> &values, const int left, const int right, const int k)
{
   if(left == right)
   {
       return values[left];
   }
   
   const int pivotIndex = partition(values, left, right);
   const int length = pivotIndex - left + 1;

   if(length == k)
   {
       return values[pivotIndex];
   }
   else if ( k < length )
   {
       return QuickSelect(values, left, pivotIndex - 1, k);
   }
   else 
   {    
       return QuickSelect(values, pivotIndex + 1, right, k - length);
   }
}
static void MarkBorderPoints(int CurrentSubproblem, LKH::LKHAlg * Alg)
{
    double Min[3], Max[3];
    int dMin, dMax, d, i, axis, ActualSubproblemSize = 0, Size = 0;
    LKH::LKHAlg::Node **A, *N;

    assert(A = (LKH::LKHAlg::Node **) malloc(Alg->DimensionSaved * sizeof(LKH::LKHAlg::Node *)));
    Min[0] = Min[1] = Min[2] = DBL_MAX;
    Max[0] = Max[1] = Max[2] = -DBL_MAX;
    if (Alg->WeightType == LKH::GEO || Alg->WeightType == LKH::GEOM ||
        Alg->WeightType == LKH::GEO_MEEUS || Alg->WeightType == LKH::GEOM_MEEUS) {
        N = Alg->FirstNode;
        do {
            N->Xc = N->X;
            N->Yc = N->Y;
            N->Zc = N->Z;
            if (Alg->WeightType == LKH::GEO || Alg->WeightType == LKH::GEO_MEEUS)
                GEO2XYZ(N->Xc, N->Yc, &N->X, &N->Y, &N->Z);
            else
                GEOM2XYZ(N->Xc, N->Yc, &N->X, &N->Y, &N->Z);
        } while ((N = N->SubproblemSuc) != Alg->FirstNode);
        Alg->CoordType = LKH::THREED_COORDS;
    }
    N = Alg->FirstNode;
    do {
        if (N->Subproblem == CurrentSubproblem) {
            for (i = Alg->CoordType == LKH::THREED_COORDS ? 2 : 1; i >= 0; i--) {
                if (Coord(N, i) < Min[i])
                    Min[i] = Coord(N, i);
                if (Coord(N, i) > Max[i])
                    Max[i] = Coord(N, i);
            }
            ActualSubproblemSize++;
        }
    } while ((N = N->SubproblemSuc) != Alg->FirstNode);
    do {
        if (N->Subproblem == CurrentSubproblem ||
            (N->X >= Min[0] && N->X <= Max[0] &&
             N->Y >= Min[1] && N->Y <= Max[1] &&
             (Alg->CoordType == LKH::TWOD_COORDS ||
              (N->Z >= Min[2] && N->Z <= Max[2])))) {
            N->Rank = INT_MAX;
            for (i = Alg->CoordType == LKH::THREED_COORDS ? 2 : 1; i >= 0; i--) {
                dMin = (int) (fabs(Coord(N, i) - Min[i]) + 0.5);
                dMax = (int) (fabs(Coord(N, i) - Max[i]) + 0.5);
                d = dMin < dMax ? dMin : dMax;
                if (d < N->Rank)
                    N->Rank = d;
            }
        } else {
            axis = -1;
            if (Alg->CoordType == LKH::TWOD_COORDS) {
                if (N->X >= Min[0] && N->X <= Max[0])
                    axis = 1;
                else if (N->Y >= Min[1] && N->Y <= Max[1])
                    axis = 0;
            } else if (N->X >= Min[0] && N->X <= Max[0]) {
                if (N->Y >= Min[1] && N->Y <= Max[1])
                    axis = 2;
                else if (N->Z >= Min[2] && N->Z <= Max[2])
                    axis = 1;
            } else if (N->Y >= Min[1] && N->Y <= Max[1] &&
                       N->Z >= Min[2] && N->Z <= Max[2])
                axis = 0;
            if (axis != -1) {
                dMin = (int) (fabs(Coord(N, axis) - Min[axis]) + 0.5);
                dMax = (int) (fabs(Coord(N, axis) - Max[axis]) + 0.5);
                N->Rank = dMin < dMax ? dMin : dMax;
            } else {
                N->Rank = 0;
                for (i = Alg->CoordType == LKH::THREED_COORDS ? 2 : 1; i >= 0; i--) {
                    dMin = (int) (fabs(Coord(N, i) - Min[i]) + 0.5);
                    dMax = (int) (fabs(Coord(N, i) - Max[i]) + 0.5);
                    d = dMin < dMax ? dMin : dMax;
                    if (d > N->Rank)
                        N->Rank = d;
                }
            }
        }
        N->Subproblem = 0;
        if (!Alg->SubproblemsCompressed ||
            ((N->SubproblemPred != N->SubBestPred ||
              N->SubproblemSuc != N->SubBestSuc) &&
             (N->SubproblemPred != N->SubBestSuc ||
              N->SubproblemSuc != N->SubBestPred)))
            A[Size++] = N;
    } while ((N = N->SubproblemSuc) != Alg->FirstNode);
    if (ActualSubproblemSize > Size)
        ActualSubproblemSize = Size;
    else
        QuickSelect(A, Size, ActualSubproblemSize);
    for (Size = 0; Size < ActualSubproblemSize; Size++)
        A[Size]->Subproblem = CurrentSubproblem;
    free(A);
    if (Alg->WeightType == LKH::GEO || Alg->WeightType == LKH::GEOM ||
       Alg-> WeightType == LKH::GEO_MEEUS || Alg->WeightType == LKH::GEOM_MEEUS) {
        N = Alg->FirstNode;
        do {
            N->X = N->Xc;
            N->Y = N->Yc;
            N->Z = N->Zc;
        } while ((N = N->SubproblemSuc) != Alg->FirstNode);
        Alg->CoordType = LKH::TWOD_COORDS;
    }
}
Esempio n. 8
0
void
QuickSelect( Etype A[ ], int N, int k )
{
    QuickSelect( A, 0, N - 1, k );
}