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;
}