以波形对数组排序

给定一个未排序的整数数组,将数组排序为波浪状数组。如果arr[0]>=arr[1]<=arr[2]>=arr[3]<=arr[4]>=…。。

null

例如:

 Input:  arr[] = {10, 5, 6, 3, 2, 20, 100, 80} Output: arr[] = {10, 5, 6, 2, 20, 3, 100, 80} OR                 {20, 5, 10, 2, 80, 6, 100, 3} OR                 any other array that is in wave form Input:  arr[] = {20, 10, 8, 6, 4, 2} Output: arr[] = {20, 8, 10, 4, 6, 2} OR                 {10, 8, 20, 2, 6, 4} OR                 any other array that is in wave form Input:  arr[] = {2, 4, 6, 8, 10, 20} Output: arr[] = {4, 2, 8, 6, 20, 10} OR                 any other array that is in wave form Input:  arr[] = {3, 6, 5, 10, 7, 20} Output: arr[] = {6, 3, 10, 5, 20, 7} OR                 any other array that is in wave form 

A. 简单解决方案 就是使用排序。首先对输入数组进行排序,然后交换所有相邻元素。 例如,让输入数组为{3,6,5,10,7,20}。排序后,我们得到{3,5,6,7,10,20}。交换相邻元素后,我们得到{5,3,7,6,20,10}。

下面是这种简单方法的实现。

C++

// A C++ program to sort an array in wave form using
// a sorting function
#include<iostream>
#include<algorithm>
using namespace std;
// A utility method to swap two numbers.
void swap( int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]..
void sortInWave( int arr[], int n)
{
// Sort the input array
sort(arr, arr+n);
// Swap adjacent elements
for ( int i=0; i<n-1; i += 2)
swap(&arr[i], &arr[i+1]);
}
// Driver program to test above function
int main()
{
int arr[] = {10, 90, 49, 2, 1, 5, 23};
int n = sizeof (arr)/ sizeof (arr[0]);
sortInWave(arr, n);
for ( int i=0; i<n; i++)
cout << arr[i] << " " ;
return 0;
}


JAVA

// Java implementation of naive method for sorting
// an array in wave form.
import java.util.*;
class SortWave
{
// A utility method to swap two numbers.
void swap( int arr[], int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4]..
void sortInWave( int arr[], int n)
{
// Sort the input array
Arrays.sort(arr);
// Swap adjacent elements
for ( int i= 0 ; i<n- 1 ; i += 2 )
swap(arr, i, i+ 1 );
}
// Driver method
public static void main(String args[])
{
SortWave ob = new SortWave();
int arr[] = { 10 , 90 , 49 , 2 , 1 , 5 , 23 };
int n = arr.length;
ob.sortInWave(arr, n);
for ( int i : arr)
System.out.print(i + " " );
}
}
/*This code is contributed by Rajat Mishra*/


Python3

# Python function to sort the array arr[0..n-1] in wave form,
# i.e., arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]
def sortInWave(arr, n):
#sort the array
arr.sort()
# Swap adjacent elements
for i in range ( 0 ,n - 1 , 2 ):
arr[i], arr[i + 1 ] = arr[i + 1 ], arr[i]
# Driver program
arr = [ 10 , 90 , 49 , 2 , 1 , 5 , 23 ]
sortInWave(arr, len (arr))
for i in range ( 0 , len (arr)):
print (arr[i],end = " " )
# This code is contributed by __Devesh Agrawal__


C#

// C# implementation of naive method
// for sorting an array in wave form.
using System;
class SortWave {
// A utility method to swap two numbers.
void swap( int [] arr, int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4]..
void sortInWave( int [] arr, int n)
{
// Sort the input array
Array.Sort(arr);
// Swap adjacent elements
for ( int i = 0; i < n - 1; i += 2)
swap(arr, i, i + 1);
}
// Driver method
public static void Main()
{
SortWave ob = new SortWave();
int [] arr = { 10, 90, 49, 2, 1, 5, 23 };
int n = arr.Length;
ob.sortInWave(arr, n);
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
}
// This code is contributed by vt_m.


Javascript

<script>
// A JavaScript program to sort an array
// in wave form using a sorting function
// A utility method to swap two numbers.
function swap(arr, x, y)
{
let temp = arr[x];
arr[x] = arr[y];
arr[y] = temp
}
// This function sorts arr[0..n-1] in
// wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >=
// arr[3] <= arr[4] >= arr[5]..
function sortInWave(arr, n)
{
// Sort the input array
arr.sort((a, b) => a - b);
// Swap adjacent elements
for (let i = 0; i < n - 1; i += 2)
swap(arr, i, i + 1);
}
// Driver code
let arr = [ 10, 90, 49, 2, 1, 5, 23 ];
let n = arr.length;
sortInWave(arr, n);
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
// This code is contributed by Surbhi Tyagi.
</script>


输出:

2 1 10 5 49 23 90

如果一个O(nLogn)排序算法 合并排序 , 堆排序 , .. 使用etc。 这可以在几分钟内完成 O(n)单次遍历的时间 给定数组的。这个想法是基于这样一个事实,如果我们确保所有的位置都是均匀的(在索引0,2,4,…)元素大于相邻的奇数元素,我们不需要担心奇数元素。以下是简单的步骤。 1) 遍历输入数组的所有偶数元素,并执行以下操作。 ….a) 如果当前元素小于上一个奇数元素,则交换上一个和当前元素。 ….b) 如果当前元素小于下一个奇数元素,则交换下一个和当前元素。

下面是上述简单算法的实现。

C++

// A O(n) program to sort an input array in wave form
#include<iostream>
using namespace std;
// A utility method to swap two numbers.
void swap( int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e., arr[0] >=
// arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5] ....
void sortInWave( int arr[], int n)
{
// Traverse all even elements
for ( int i = 0; i < n; i+=2)
{
// If current even element is smaller than previous
if (i>0 && arr[i-1] > arr[i] )
swap(&arr[i], &arr[i-1]);
// If current even element is smaller than next
if (i<n-1 && arr[i] < arr[i+1] )
swap(&arr[i], &arr[i + 1]);
}
}
// Driver program to test above function
int main()
{
int arr[] = {10, 90, 49, 2, 1, 5, 23};
int n = sizeof (arr)/ sizeof (arr[0]);
sortInWave(arr, n);
for ( int i=0; i<n; i++)
cout << arr[i] << " " ;
return 0;
}


JAVA

// A O(n) Java program to sort an input array in wave form
class SortWave
{
// A utility method to swap two numbers.
void swap( int arr[], int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4]....
void sortInWave( int arr[], int n)
{
// Traverse all even elements
for ( int i = 0 ; i < n; i+= 2 )
{
// If current even element is smaller
// than previous
if (i> 0 && arr[i- 1 ] > arr[i] )
swap(arr, i- 1 , i);
// If current even element is smaller
// than next
if (i<n- 1 && arr[i] < arr[i+ 1 ] )
swap(arr, i, i + 1 );
}
}
// Driver program to test above function
public static void main(String args[])
{
SortWave ob = new SortWave();
int arr[] = { 10 , 90 , 49 , 2 , 1 , 5 , 23 };
int n = arr.length;
ob.sortInWave(arr, n);
for ( int i : arr)
System.out.print(i+ " " );
}
}
/*This code is contributed by Rajat Mishra*/


Python3

# Python function to sort the array arr[0..n-1] in wave form,
# i.e., arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= arr[5]
def sortInWave(arr, n):
# Traverse all even elements
for i in range ( 0 , n, 2 ):
# If current even element is smaller than previous
if (i> 0 and arr[i] < arr[i - 1 ]):
arr[i],arr[i - 1 ] = arr[i - 1 ],arr[i]
# If current even element is smaller than next
if (i < n - 1 and arr[i] < arr[i + 1 ]):
arr[i],arr[i + 1 ] = arr[i + 1 ],arr[i]
# Driver program
arr = [ 10 , 90 , 49 , 2 , 1 , 5 , 23 ]
sortInWave(arr, len (arr))
for i in range ( 0 , len (arr)):
print (arr[i],end = " " )
# This code is contributed by __Devesh Agrawal__


C#

// A O(n) C# program to sort an
// input array in wave form
using System;
class SortWave {
// A utility method to swap two numbers.
void swap( int [] arr, int a, int b)
{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// This function sorts arr[0..n-1] in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4]....
void sortInWave( int [] arr, int n)
{
// Traverse all even elements
for ( int i = 0; i < n; i += 2) {
// If current even element is smaller
// than previous
if (i > 0 && arr[i - 1] > arr[i])
swap(arr, i - 1, i);
// If current even element is smaller
// than next
if (i < n - 1 && arr[i] < arr[i + 1])
swap(arr, i, i + 1);
}
}
// Driver program to test above function
public static void Main()
{
SortWave ob = new SortWave();
int [] arr = { 10, 90, 49, 2, 1, 5, 23 };
int n = arr.Length;
ob.sortInWave(arr, n);
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
}
// This code is contributed by vt_m.


Javascript

<script>
// A O(n) program to sort
// an input array in wave form
// A utility method to swap two numbers.
function swap(arr, a, b)
{
let temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// This function sorts arr[0..n-1]
// in wave form, i.e.,
// arr[0] >= arr[1] <= arr[2] >=
// arr[3] <= arr[4]....
function sortInWave( arr, n)
{
// Traverse all even elements
for (let i = 0; i < n; i+=2)
{
// If current even element
// is smaller than previous
if (i>0 && arr[i-1] > arr[i] )
swap(arr, i-1, i);
// If current even element
// is smaller than next
if (i<n-1 && arr[i] < arr[i+1] )
swap(arr, i, i + 1);
}
}
// driver code
let arr = [10, 90, 49, 2, 1, 5, 23];
let n = arr.length;
sortInWave(arr, n);
for (let i=0; i<n; i++)
document.write(arr[i] + " " );
</script>


输出:

90 10 49 1 5 2 23 

本文由 希瓦姆 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

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