In: Computer Science
Given an array A of n integers, describe an O(n log n)
algorithm to decide if the elements of A are all distinct. Why does
your algorithm run in O(n log n) time?
#include<iostream>
using
namespace
std;
/*Merges two subarrays of arr[].
// First subarray is arr[l..m]
*/ Second subarray is arr[m+1..r]
void
merge(
int
arr[],
int
l,
int
m,
int
r)
{
int
n1 =
m - l + 1;
int
n2 =
r - m;
// Create temp
arrays
int
L[n1], R[n2];
// Copy data to temp
arrays L[] and R[]
for
(
int
i = 0; i < n1; i++)
L[i]
= arr[l + i];
for
(
int
j = 0; j < n2; j++)
R[j]
= arr[m + 1 + j];
// Merge the temp
arrays back into arr[l..r]
// Initial index of
first subarray
int
i =
0;
// Initial index of
second subarray
int
j =
0;
// Initial index of
merged subarray
int
k =
l;
while
(i
< n1 && j < n2)
{
if
(L[i] <= R[j])
{
arr[k]
= L[i];
i++;
}
else
{
arr[k]
= R[j];
j++;
}
k++;
}
// Copy the remaining
elements of
// L[], if there are
any
while
(i
< n1)
{
arr[k]
= L[i];
i++;
k++;
}
// Copy the remaining
elements of
// R[], if there are
any
while
(j
< n2)
{
arr[k]
= R[j];
j++;
k++;
}
}
// l is for left index and r is
// right index of the sub-array
// of arr to be sorted */
void
mergeSort(
int
arr[],
int
l,
int
r)
{
if
(l
< r)
{
//
Same as (l+r)/2, but avoids
//
overflow for large l and h
int
m = l + (r - l) / 2;
//
Sort first and second halves
mergeSort(arr,
l, m);
mergeSort(arr,
m + 1, r);
merge(arr,
l, m, r);
}
}
/*Here you have sorted an array using Merge Sort which will sort your array in O(nlogn) time.
and the using liner search you can compare each element if there is a common element adjacent element then you can return false else return true.
*/
int
main()
{
int
arr[] = { 12, 11, 13, 5, 6, 7 };
int
arr_size =
sizeof
(arr) /
sizeof
(arr[0]);
cout <<
"Given array is \n"
;
printArray(arr,
arr_size);
mergeSort(arr, 0,
arr_size - 1);
for(int i=0;i<arr_size-1;i++)
if(arr[i]==arr[i+1])
cout<<"Array does not contain distinct element \n ";
if(i==arr_size)
court<<"Distinct Element\n";
return
0;
}