#include <iostream>
#include <cstdlib>

struct Data
{
   int key;
   int original_index;
};

bool compare_with_itself_called = false;
bool pointer_order_changed = false;

int compare(const void *p1, const void *p2)
{
   if(p1==p2)
   {
      compare_with_itself_called = true;
      return 0;
   }
   const Data *d1 = (const Data*)p1;
   const Data *d2 = (const Data*)p2;
   if(d1->key < d2->key)
     return -1;
   if(d2->key < d1->key)
     return 1;
   bool index_cond = d1->original_index<d2->original_index;
   bool ptr_cond = (p1<p2);
   if(index_cond!=ptr_cond)
   {
      pointer_order_changed = true;
   }
   return index_cond ? -1 : 1;
}

void outputArray(Data d[], unsigned n)
{
   for(unsigned i=0; i!=n; ++i)
      std::cout << d[i].key << "@" << d[i].original_index << std::endl;
}

int main()
{
   const unsigned N = 4;
   Data array[N] = { { 8, 0 }, { 8, 1 }, { 1, 2 }, { 1, 3 } };
   qsort(array, N, sizeof(Data), compare);
   outputArray(array, N);
   std::cout << std::endl << "compare_with_itself_called="
      << (compare_with_itself_called ? "true" : "false") << std::endl;
   std::cout << "pointer_order_changed="
      << (pointer_order_changed ? "true" : "false") << std::endl;
   return 0;
}