مرتب سازی موجی داده ها — راهنمای کاربردی
در این مطلب، روش مرتبسازی آرایه به شکل موجی یا در واقع، روش مرتب سازی موجی (Wave Sort) آموزش داده خواهد شد. یک آرایه مرتب نشده از اعداد صحیح داده شده است. هدف، مرتبسازی آرایه به شکل یک آرایه موجی است. آرایه [arr[0..n-1 به شکل موجی مرتب شده است اگر به صورت زیر باشد.
arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= …..
مثالی از این مورد در ادامه آمده است.
Input: arr[] = {10, 5, 6, 3, 2, 20, 100, 80}
Output: arr[] = {10, 5, 6, 2, 20, 3, 100, 80} OR
{۲۰, ۵, ۱۰, ۲, ۸۰, ۶, ۱۰۰, ۳} 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
{۱۰, ۸, ۲۰, ۲, ۶, ۴} 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
یک راهکار ساده برای دریافت خروجی بالا، استفاده از مرتبسازی است. در این راستا، ابتدا باید آرایه را مرتب کرد و سپس، عناصر مجاور را عوض کرد. برای مثال، آرایه ورودی باید {۲۰, ۷, ۱۰, ۵, ۶, ۳} باشد. پس از مرتبسازی، خروجی {۲۰, ۱۰, ۷, ۶, ۵, ۳} حاصل میشود. پس از مرتبسازی عناصر مجاور، {۱۰, ۲۰, ۶, ۷, ۳, ۵} حاصل میشود. در ادامه، پیادهسازی این راهکار در زبانهای برنامهنویسی گوناگون ارائه شده است.
پیادهسازی در ++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 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*/
پیادهسازی در پایتون
# 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],
# 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.
خروجی قطعه کد بالا به صورت زیر است.
۲ ۱ ۱۰ ۵ ۴۹ ۲۳ ۹۰
پیچیدگی زمانی روش بالا در صورت استفاده از الگوریتمهای مرتبسازی دارای درجه O(nLogn)، مانند «مرتبسازی ادغامی» (Merge Sort) و «مرتبسازی هرمی» (Heap Sort)، از درجه O(nLogn) خواهد بود. این کار در زمان O(n) با انجام یک پیمایش مجرد انجام میشود. ایده این کار بر مبنای این حقیقت است که اگر اطمینان حاصل شود که همه عناصر قرار گرفته در موقعیتهای زوج (۰، ۲، ۴ و …) بزرگتر از عناصر فرد مجاور خود باشند، نیازی به نگرانی پیرامون عناصر قرار گرفته در سمت چپ وجود ندارد. در ادامه، این گامهای ساده ارائه شده است.
- پیمایش همه عناصر قرار گرفته از آرایه ورود و انجام اقدامات زیر:
- اگر عنصر کنونی کوچکتر از عنصر فرد است، عنصر پیشین و کنونی را جابهجا کن.
- اگر عنصر کنونی کوچکتر از عنصر فرد بعدی است، عنصر بعدی و کنونی رو جابهجا کن.
در ادامه، پیادهسازی الگوریتم ساده بالا در زبانهای برنامهنویسی گوناگون ارائه شده است.
پیادهسازی در 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;
}
پیادهسازی در جاوا
// 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*/
پیادهسازی در پایتون
# 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],
# 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.
خروجی قطعه کد بالا به صورت زیر است.
۹۰ ۱۰ ۴۹ ۱ ۵ ۲ ۲۳
منبع [+]
مجموعه: برنامه نویسی, مهندسی کامپیوتر برچسب ها: Array Sort, Sorting, Wave Sort, تکنیک های مرتب سازی, مرتب سازی, مرتب سازی آرایه, مرتب سازی موجی