应用给定方程式后对数组排序

我们有一个按升序排序的整数数组。我们还有3个整数A、B和C。我们需要对数组中的每个元素x应用A*x*x+B*x+C,并对修改后的数组进行排序。

null

例子:

Input : arr[] = {-1, 0, 1, 2, 3, 4}        A = -1, B = 2, C = -1Output : {-9, -4, -4, -1, -1, 0}Input array is {-1, 0, 1, 2, 3, 4}. Afterapplying the equation A*x*x + B*x + C onevery element x we get, {-4,-1, 0, -1, -4, -9}After sorting, we get {-9, -4, -4, -1, -1, 0}

方法1(简单): 1-将给定方程式应用于所有元素。O(n) 2-对修改后的数组进行排序。O(n日志n) O(n logn)的时间复杂度

方法2(有效):抛物线性质 给出的方程是抛物线方程。因此,将其应用于已排序数组的结果将产生一个数组,该数组将具有最大值/最小值,子数组将在其左侧和右侧排序。 在上面的示例中,最大值为0,其左侧的子数组{-4,-1}按升序排序,其右侧的子数组{-1,-4,-9}按降序排序。 我们需要做的就是合并这些排序的数组,它们在时间上是线性的。

所以算法是:

  1. 对每个元素应用公式。
  2. 找到最大值/最小值。
  3. 合并子数组。

注意:下面的代码假设修改后的数组先增大后减小。

C++

// C program to sort an array after applying equation
// A*x*x + B*x + C
#include<bits/stdc++.h>
using namespace std;
// Function to sort an array after applying given
// equation.
void sortArray( int arr[], int n, int A, int B, int C)
{
// Apply equation on all elements
for ( int i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index, maximum = INT_MIN;
for ( int i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays using simple
// merge function of merge sort
int i = 0, j = n-1;
int new_arr[n], k = 0;
while (i < index && j > index)
{
if (arr[i] < arr[j])
new_arr[k++] = arr[i++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (i < index)
new_arr[k++] = arr[i++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for ( int i = 0; i < n ; i++)
arr[i] = new_arr[i];
}
// Driver code
int main()
{
int arr[] = {-21 ,-15, 12, 13, 14 };
int n = sizeof (arr) / sizeof (arr[0]);
int A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
cout << "Array after sorting is : n" ;
for ( int i=0; i<n; i++)
cout << arr[i] << " " ;
return 0;
}


JAVA

// Java program to sort an array after applying equation
// A*x*x + B*x + C
class Main
{
// Function to sort an array after applying given
// equation.
static void sortArray( int arr[], int n, int A, int B, int C)
{
// Apply equation on all elements
for ( int i = 0 ; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index=- 1 ;
int maximum = - 999999 ;
for ( int i = 0 ; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays using simple
// merge function of merge sort
int i = 0 , j = n- 1 ;
int [] new_arr = new int [n];
int k = 0 ;
while (i < index && j > index)
{
if (arr[i] < arr[j])
new_arr[k++] = arr[i++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (i < index)
new_arr[k++] = arr[i++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n- 1 ] = maximum;
// Modify original array
for ( int p = 0 ; p < n ; p++)
arr[p] = new_arr[p];
}
// main function
public static void main (String[] args)
{
int arr[] = {- 21 ,- 15 , 12 , 13 , 14 };
int n = arr.length;
int A = - 6 , B =- 7 , C = 2 ;
sortArray(arr, n, A, B, C);
System.out.println( "Array after sorting is : " );
for ( int i= 0 ; i<n; i++)
System.out.print(arr[i]+ " " );
}
}
/* This code is contributed by Harsh Agarwal */


Python3

# Python3 program to sort an
# array after applying equation
# A*x*x + B*x + C
import sys
# Function to sort an array
# after applying given equation.
def sortArray(arr, n, A, B, C):
# Apply equation on all elements
for i in range (n):
arr[i] = (A * arr[i] * arr[i] +
B * arr[i] + C)
index = - (sys.maxsize - 1 )
maximum = - (sys.maxsize - 1 )
# Find maximum element in
# resultant array
for i in range (n):
if maximum < arr[i]:
index = i
maximum = arr[i]
# Use maximum element as a break point
# and merge both subarrays using simple
# merge function of merge sort
i = 0 ; j = n - 1 ;
new_arr = [ 0 ] * n
k = 0
while i < index and j > index:
if arr[i] < arr[j]:
new_arr[k] = arr[i]
k + = 1
i + = 1
else :
new_arr[k] = arr[j]
k + = 1
j - = 1
# Merge remaining elements
while i < index:
new_arr[k] = arr[i]
k + = 1
i + = 1
# Modify original array
while j > index:
new_arr[k] = arr[j]
k + = 1
j - = 1
new_arr[n - 1 ] = maximum
for i in range (n):
arr[i] = new_arr[i]
# Driver code
arr = [ - 21 , - 15 , 12 , 13 , 14 ]
n = len (arr)
A = - 6
B = - 7
C = 2
sortArray(arr, n, A, B, C)
print ( "Array after sorting is:" )
for i in range (n):
print (arr[i], end = " " )
# This code is contributed
# by Shrikant13


C#

// C# program to sort an array after applying equation
// A*x*x + B*x + C
using System;
class MAIN
{
// Function to sort an array after applying given
// equation.
static void sortArray( int [] arr, int n, int A, int B, int C)
{
// Apply equation on all elements
for ( int i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index=-1;
int maximum = -999999;
for ( int i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays using simple
// merge function of merge sort
int l = 0, j = n-1;
int [] new_arr = new int [n];
int k = 0;
while (l < index && j > index)
{
if (arr[l] < arr[j])
new_arr[k++] = arr[l++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (l < index)
new_arr[k++] = arr[l++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for ( int p = 0; p < n ; p++)
arr[p] = new_arr[p];
}
// main function
public static void Main ()
{
int [] arr = {-21 ,-15, 12, 13, 14 };
int n = arr.Length;
int A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
Console.Write( "Array after sorting is : " + "" );
for ( int i=0; i<n; i++)
Console.Write(arr[i]+ " " );
}
}


PHP

<?php
// PHP program to sort an array after
// applying equation A*x*x + B*x + C
// Function to sort an array after
// applying given   equation.
function sortArray(& $arr , $n , $A , $B , $C )
{
// Apply equation on all elements
for ( $i = 0; $i < $n ; $i ++)
$arr [ $i ] = $A * $arr [ $i ] * $arr [ $i ] +
$B * $arr [ $i ] + $C ;
// Find maximum element in
// resultant array
$index = 0;
$maximum = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $maximum < $arr [ $i ])
{
$index = $i ;
$maximum = $arr [ $i ];
}
}
// Use maximum element as a break point
// and merge both subarrays using simple
// merge function of merge sort
$i = 0;
$j = $n - 1;
$new_arr = array ();
while ( $i < $index && $j > $index )
{
if ( $arr [ $i ] < $arr [ $j ])
array_push ( $new_arr , $arr [ $i ++]);
else
array_push ( $new_arr , $arr [ $j --]);
}
// Merge remaining elements
while ( $i < $index )
array_push ( $new_arr , $arr [ $i ++]);
while ( $j > $index )
array_push ( $new_arr , $arr [ $j --]);
array_push ( $new_arr , $maximum );
// Modify original array
for ( $i = 0; $i < count ( $new_arr ) ; $i ++)
$arr [ $i ] = $new_arr [ $i ];
}
// Driver code
$arr = array (-21 ,-15, 12, 13, 14 );
$n = count ( $arr );
$A = -6;
$B = -7;
$C = 2;
sortArray( $arr , $n , $A , $B , $C );
echo "Array after sorting is : " ;
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
// This code is contributed by mits
?>


Javascript

<script>
function sortArray(arr,n,A,B,C)
{
// Apply equation on all elements
for (let i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
let index=-1;
let maximum = -999999;
for (let i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays using simple
// merge function of merge sort
let i = 0, j = n-1;
let new_arr = new Array(n);
for (let i=0;i<n;i++)
{
new_arr[i]=0;
}
let k = 0;
while (i < index && j > index)
{
if (arr[i] < arr[j])
new_arr[k++] = arr[i++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (i < index)
new_arr[k++] = arr[i++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for (let p = 0; p < n ; p++)
arr[p] = new_arr[p];
}
let arr=[-21 ,-15, 12, 13, 14];
let n = arr.length;
let A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
document.write( "Array after sorting is : <br>" );
for (let i=0; i<n; i++)
document.write(arr[i]+ " " );
// This code is contributed by avanitrachhadiya2155
</script>


输出:

Array after sorting is : -2497 -1272 -1243 -1103 -946 

时间复杂性: O(n) 辅助空间: O(n)

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享