// sort_vector_vs_array.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <cmath>
#include <vector>
#include <ctime>
#include <cstdlib>
//#include <chrono>
const int arraylength= 2000000 ;
//This is an implementation of merge_sort, an algorithm to sort a list of integers using
//a recursion relation. The merge_sort is written as two functions, `merge` which takes two
//pre-sorted lists and merges them to a single sorted list. This is called on by merge_sort,
//which also recursively calls itself.
//I've implemented it here twice, first with the two functions `merge` and `merge_sort`, and then
//again with `vmerge` and `vmerge_sort`. The first two take as their argument arrays of integers,
//while the second two take the data type `vector` from the `vector` package (is package the right word?
//or do I say library?).
void merge( int A[ ] , int LA[ ] , int RA[ ] , int p, int q, int r)
{
//n1 and n2 are the lengths of the pre-sorted sublists, A[p..q] and A[q+1..r]
int n1= q- p+ 1 ;
int n2= r- q;
//Copy the left and right halves of the A array into the L and R arrays
for ( int i= 0 ; i< n1; i++ )
{
LA[ i] = A[ p+ i] ;
}
for ( int j= 0 ; j< n2; j++ )
{
RA[ j] = A[ q+ 1 + j] ;
}
//Merge the L and R lists
int i= 0 ;
int j= 0 ;
int k = p;
while ( i < n1 && j < n2) {
A[ k++ ] = ( LA[ i] <= RA[ j] )
? LA[ i++ ]
: RA[ j++ ] ;
}
while ( i < n1) {
A[ k++ ] = LA[ i++ ] ;
}
while ( j < n2) {
A[ k++ ] = RA[ j++ ] ;
}
}
void merge_sort( int A[ ] , int LA[ ] , int RA[ ] , int p, int r)
{
//This recursively splits the array A into smaller sections
if ( p< r)
{
int q= ( p+ r) / 2 ;
merge_sort( A,LA,RA,p,q) ;
merge_sort( A,LA,RA,q+ 1 ,r) ;
merge( A,LA,RA,p,q,r) ;
}
}
void vmerge( std:: vector < int > & A, std:: vector < int > & LA, std:: vector < int > & RA, int p, int q, int r)
{
//n1 and n2 are the lengths of the pre-sorted sublists, A[p..q] and A[q+1..r]
int n1= q- p+ 1 ;
int n2= r- q;
//Copy the left and right halves of the A array into the L and R arrays
for ( int i= 0 ; i< n1; i++ )
{
LA[ i] = A[ p+ i] ;
}
for ( int j= 0 ; j< n2; j++ )
{
RA[ j] = A[ q+ 1 + j] ;
}
//Merge the L and R lists
int i= 0 ;
int j= 0 ;
int k = p;
while ( i < n1 && j < n2) {
A[ k++ ] = ( LA[ i] <= RA[ j] )
? LA[ i++ ]
: RA[ j++ ] ;
}
while ( i < n1) {
A[ k++ ] = LA[ i++ ] ;
}
while ( j < n2) {
A[ k++ ] = RA[ j++ ] ;
}
}
void vmerge_sort( std:: vector < int > & A, std:: vector < int > & LA, std:: vector < int > & RA, int p, int r)
{
//This recursively splits the array A into smaller sections
if ( p< r)
{
int q= ( p+ r) / 2 ;
vmerge_sort( A,LA,RA,p,q) ;
vmerge_sort( A,LA,RA,q+ 1 ,r) ;
vmerge( A,LA,RA,p,q,r) ;
}
}
int main( void )
{
//seed the random number generator
srand ( time ( 0 ) ) ;
//std::chrono::high_resolution_clock::time_point t1,t2;
std:: cout << "C++ merge-sort test" << std:: endl ;
int halfarraylength= arraylength/ 2 + 2 ;
//rlist1 is defined to be an integer array
//L and R are the subarrays used in the merge function
int * rlist1= new int [ arraylength] ;
int * R= new int [ halfarraylength] ;
int * L= new int [ halfarraylength] ;
//vlist is defined to be of type vector<int>
//vL and vR are the left and right subvectors used in the vmerge function
std:: vector < int > vlist1( arraylength) ;
std:: vector < int > vL( halfarraylength) ;
std:: vector < int > vR( halfarraylength) ;
//both vlist1 and rlist1 have the same content, 2 million random integers
for ( int i= 0 ; i<= arraylength- 1 ; i++ )
{
rlist1[ i] = rand ( ) % 1000000 ;
vlist1[ i] = rlist1[ i] ;
}
//here I sort rlist1
//t1 = std::chrono::high_resolution_clock::now();
std:: clock_t t1= clock ( ) ;
merge_sort( rlist1,L,R,0 ,arraylength- 1 ) ;
//t2 = std::chrono::high_resolution_clock::now();
std:: clock_t t2= clock ( ) ;
std:: cout << "sorting " << arraylength<< " random numbers with merge sort took "
// << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
// << " milliseconds\n";
<< ( double ) ( t2 - t1) / CLOCKS_PER_SEC << " seconds\n " ;
//here I sort vlist1
//t1 = std::chrono::high_resolution_clock::now();
t1 = clock ( ) ;
vmerge_sort( vlist1,vL,vR,0 ,arraylength- 1 ) ;
//t2 = std::chrono::high_resolution_clock::now();
t2 = clock ( ) ;
std:: cout << "sorting " << arraylength<< " random numbers with vmerge sort took "
// << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
// << " milliseconds\n";
<< ( double ) ( t2 - t1) / CLOCKS_PER_SEC << " seconds\n " ;
//Now we test that both sorted lists are identical
std:: cout << "Testing that both sorted lists are the same" << std:: endl ;
for ( int k= 0 ; k< arraylength; k++ )
{
if ( rlist1[ k] ! = vlist1[ k] )
{
std:: cout << "The lists are not the same\n " ;
return - 1 ;
}
}
std:: cout << "Both lists are the same\n " ;
return 0 ;
}
Ly8gc29ydF92ZWN0b3JfdnNfYXJyYXkuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgovLwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGNzdGRsaWI+Ci8vI2luY2x1ZGUgPGNocm9ubz4KCgpjb25zdCBpbnQgYXJyYXlsZW5ndGg9MjAwMDAwMDsKCi8vVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBtZXJnZV9zb3J0LCBhbiBhbGdvcml0aG0gdG8gc29ydCBhIGxpc3Qgb2YgaW50ZWdlcnMgdXNpbmcKLy9hIHJlY3Vyc2lvbiByZWxhdGlvbi4gIFRoZSBtZXJnZV9zb3J0IGlzIHdyaXR0ZW4gYXMgdHdvIGZ1bmN0aW9ucywgYG1lcmdlYCB3aGljaCB0YWtlcyB0d28KLy9wcmUtc29ydGVkIGxpc3RzIGFuZCBtZXJnZXMgdGhlbSB0byBhIHNpbmdsZSBzb3J0ZWQgbGlzdC4gIFRoaXMgaXMgY2FsbGVkIG9uIGJ5IG1lcmdlX3NvcnQsIAovL3doaWNoIGFsc28gcmVjdXJzaXZlbHkgY2FsbHMgaXRzZWxmLgoKLy9JJ3ZlIGltcGxlbWVudGVkIGl0IGhlcmUgdHdpY2UsIGZpcnN0IHdpdGggdGhlIHR3byBmdW5jdGlvbnMgYG1lcmdlYCBhbmQgYG1lcmdlX3NvcnRgLCBhbmQgdGhlbgovL2FnYWluIHdpdGggYHZtZXJnZWAgYW5kIGB2bWVyZ2Vfc29ydGAuICBUaGUgZmlyc3QgdHdvIHRha2UgYXMgdGhlaXIgYXJndW1lbnQgYXJyYXlzIG9mIGludGVnZXJzLCAKLy93aGlsZSB0aGUgc2Vjb25kIHR3byB0YWtlIHRoZSBkYXRhIHR5cGUgYHZlY3RvcmAgZnJvbSB0aGUgYHZlY3RvcmAgcGFja2FnZSAoaXMgcGFja2FnZSB0aGUgcmlnaHQgd29yZD8KLy9vciBkbyBJIHNheSBsaWJyYXJ5PykuICAKCgp2b2lkIG1lcmdlKGludCBBW10sIGludCBMQVtdLCBpbnQgUkFbXSwgaW50IHAsIGludCBxLCBpbnQgcikKewogICAgLy9uMSBhbmQgbjIgYXJlIHRoZSBsZW5ndGhzIG9mIHRoZSBwcmUtc29ydGVkIHN1Ymxpc3RzLCBBW3AuLnFdIGFuZCBBW3ErMS4ucl0KICAgIGludCBuMT1xLXArMTsKICAgIGludCBuMj1yLXE7CiAgICAvL0NvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbHZlcyBvZiB0aGUgQSBhcnJheSBpbnRvIHRoZSBMIGFuZCBSIGFycmF5cwogICAgZm9yKGludCBpPTA7aTxuMTsgaSsrKQogICAgewogICAgICAgIExBW2ldPUFbcCtpXTsKICAgIH0KICAgIGZvcihpbnQgaj0wO2o8bjI7IGorKykKICAgIHsKICAgICAgICBSQVtqXT1BW3ErMStqXTsKICAgIH0KCgogICAgLy9NZXJnZSB0aGUgTCBhbmQgUiBsaXN0cwogICAgaW50IGk9MDsKICAgIGludCBqPTA7CiAgICBpbnQgayA9IHA7CiAgICB3aGlsZShpIDwgbjEgJiYgaiA8IG4yKSB7CiAgICAgICAgQVtrKytdID0gKExBW2ldPD1SQVtqXSkgIAogICAgICAgICAgICAgICAgICAgPyBMQVtpKytdICAgIAogICAgICAgICAgICAgICAgICAgOiBSQVtqKytdOwogICAgfQogICAgd2hpbGUoaSA8IG4xKSB7CiAgICAgICAgQVtrKytdID0gTEFbaSsrXTsKICAgIH0KICAgIHdoaWxlKGogPCBuMikgewogICAgICAgIEFbaysrXSA9IFJBW2orK107CiAgICB9Cn0KCnZvaWQgbWVyZ2Vfc29ydChpbnQgQVtdLCBpbnQgTEFbXSwgaW50IFJBW10sIGludCBwLCBpbnQgcikKewogICAgLy9UaGlzIHJlY3Vyc2l2ZWx5IHNwbGl0cyB0aGUgYXJyYXkgQSBpbnRvIHNtYWxsZXIgc2VjdGlvbnMgCiAgICBpZihwPHIpCiAgICB7CiAgICAgICAgaW50IHE9KHArcikvMjsKICAgICAgICBtZXJnZV9zb3J0KEEsTEEsUkEscCxxKTsKICAgICAgICBtZXJnZV9zb3J0KEEsTEEsUkEscSsxLHIpOwogICAgICAgIG1lcmdlKEEsTEEsUkEscCxxLHIpOwogICAgfQoKfQoKCnZvaWQgdm1lcmdlKHN0ZDo6dmVjdG9yPGludD4mIEEsIHN0ZDo6dmVjdG9yPGludD4mIExBLCBzdGQ6OnZlY3RvcjxpbnQ+JiBSQSwgaW50IHAsIGludCBxLCBpbnQgcikKewogICAgLy9uMSBhbmQgbjIgYXJlIHRoZSBsZW5ndGhzIG9mIHRoZSBwcmUtc29ydGVkIHN1Ymxpc3RzLCBBW3AuLnFdIGFuZCBBW3ErMS4ucl0KICAgIGludCBuMT1xLXArMTsKICAgIGludCBuMj1yLXE7CiAgICAvL0NvcHkgdGhlIGxlZnQgYW5kIHJpZ2h0IGhhbHZlcyBvZiB0aGUgQSBhcnJheSBpbnRvIHRoZSBMIGFuZCBSIGFycmF5cwogICAgZm9yKGludCBpPTA7aTxuMTsgaSsrKQogICAgewogICAgICAgIExBW2ldPUFbcCtpXTsKICAgIH0KICAgIGZvcihpbnQgaj0wO2o8bjI7IGorKykKICAgIHsKICAgICAgICBSQVtqXT1BW3ErMStqXTsKICAgIH0KCgogICAgLy9NZXJnZSB0aGUgTCBhbmQgUiBsaXN0cwogICAgaW50IGk9MDsKICAgIGludCBqPTA7CiAgICBpbnQgayA9IHA7CiAgICB3aGlsZShpIDwgbjEgJiYgaiA8IG4yKSB7CiAgICAgICAgQVtrKytdID0gKExBW2ldPD1SQVtqXSkgIAogICAgICAgICAgICAgICAgICAgPyBMQVtpKytdICAgIAogICAgICAgICAgICAgICAgICAgOiBSQVtqKytdOwogICAgfQogICAgd2hpbGUoaSA8IG4xKSB7CiAgICAgICAgQVtrKytdID0gTEFbaSsrXTsKICAgIH0KICAgIHdoaWxlKGogPCBuMikgewogICAgICAgIEFbaysrXSA9IFJBW2orK107CiAgICB9Cn0KCnZvaWQgdm1lcmdlX3NvcnQoc3RkOjp2ZWN0b3I8aW50PiYgQSwgc3RkOjp2ZWN0b3I8aW50PiYgTEEsIHN0ZDo6dmVjdG9yPGludD4mIFJBLCBpbnQgcCwgaW50IHIpCnsKICAgIC8vVGhpcyByZWN1cnNpdmVseSBzcGxpdHMgdGhlIGFycmF5IEEgaW50byBzbWFsbGVyIHNlY3Rpb25zIAogICAgaWYocDxyKQogICAgewogICAgICAgIGludCBxPShwK3IpLzI7CiAgICAgICAgdm1lcmdlX3NvcnQoQSxMQSxSQSxwLHEpOwogICAgICAgIHZtZXJnZV9zb3J0KEEsTEEsUkEscSsxLHIpOwogICAgICAgIHZtZXJnZShBLExBLFJBLHAscSxyKTsKICAgIH0KCn0KCgppbnQgbWFpbih2b2lkKQp7CiAgICAvL3NlZWQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCiAgICBzcmFuZCh0aW1lKDApKTsKICAgIC8vc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6dGltZV9wb2ludCB0MSx0MjsKICAgIAogICAgc3RkOjpjb3V0PDwiQysrIG1lcmdlLXNvcnQgdGVzdCI8PHN0ZDo6ZW5kbDsKCiAgICBpbnQgaGFsZmFycmF5bGVuZ3RoPWFycmF5bGVuZ3RoLzIrMjsKICAgIAogICAgLy9ybGlzdDEgaXMgZGVmaW5lZCB0byBiZSBhbiBpbnRlZ2VyIGFycmF5CiAgICAvL0wgYW5kIFIgYXJlIHRoZSBzdWJhcnJheXMgdXNlZCBpbiB0aGUgbWVyZ2UgZnVuY3Rpb24KICAgIGludCAqcmxpc3QxPSBuZXcgaW50W2FycmF5bGVuZ3RoXTsKICAgIGludCAqUj0gbmV3IGludFtoYWxmYXJyYXlsZW5ndGhdOwogICAgaW50ICpMPSBuZXcgaW50W2hhbGZhcnJheWxlbmd0aF07CgoKICAgIC8vdmxpc3QgaXMgZGVmaW5lZCB0byBiZSBvZiB0eXBlIHZlY3RvcjxpbnQ+CiAgICAvL3ZMIGFuZCB2UiBhcmUgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnZlY3RvcnMgdXNlZCBpbiB0aGUgdm1lcmdlIGZ1bmN0aW9uCiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZsaXN0MShhcnJheWxlbmd0aCk7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZMKGhhbGZhcnJheWxlbmd0aCk7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZSKGhhbGZhcnJheWxlbmd0aCk7CgoKICAgIC8vYm90aCB2bGlzdDEgYW5kIHJsaXN0MSBoYXZlIHRoZSBzYW1lIGNvbnRlbnQsIDIgbWlsbGlvbiByYW5kb20gaW50ZWdlcnMKICAgIGZvcihpbnQgaT0wO2k8PWFycmF5bGVuZ3RoLTE7aSsrKQogICAgewogICAgICAgIHJsaXN0MVtpXSA9IHJhbmQoKSAlIDEwMDAwMDA7CiAgICAgICAgdmxpc3QxW2ldID0gcmxpc3QxW2ldOwogICAgfQoKCiAgICAvL2hlcmUgSSBzb3J0IHJsaXN0MQogICAgLy90MSA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgc3RkOjpjbG9ja190IHQxPWNsb2NrKCk7CiAgICBtZXJnZV9zb3J0KHJsaXN0MSxMLFIsMCxhcnJheWxlbmd0aC0xKTsKICAgIC8vdDIgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHN0ZDo6Y2xvY2tfdCB0Mj1jbG9jaygpOwogICAgc3RkOjpjb3V0IDw8ICJzb3J0aW5nICI8PGFycmF5bGVuZ3RoPDwiIHJhbmRvbSBudW1iZXJzIHdpdGggbWVyZ2Ugc29ydCB0b29rICIKICAgIC8vICAgICAgICAgICAgICAgPDwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4odDItdDEpLmNvdW50KCkKICAgIC8vICAgICAgICAgICAgICAgPDwgIiBtaWxsaXNlY29uZHNcbiI7CiAgICAgICAgICAgICAgICAgICA8PCAoZG91YmxlKSh0MiAtIHQxKSAvIENMT0NLU19QRVJfU0VDIDw8ICIgc2Vjb25kc1xuIjsKCgogICAgLy9oZXJlIEkgc29ydCB2bGlzdDEgICAgICAgICAgCiAgICAvL3QxID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICB0MSA9IGNsb2NrKCk7CiAgICB2bWVyZ2Vfc29ydCh2bGlzdDEsdkwsdlIsMCxhcnJheWxlbmd0aC0xKTsKICAgIC8vdDIgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIHQyID0gY2xvY2soKTsKICAgIHN0ZDo6Y291dCA8PCAic29ydGluZyAiPDxhcnJheWxlbmd0aDw8IiByYW5kb20gbnVtYmVycyB3aXRoIHZtZXJnZSBzb3J0IHRvb2sgIgogICAgLy8gICAgICAgICAgICAgICA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPih0Mi10MSkuY291bnQoKQogICAgLy8gICAgICAgICAgICAgICA8PCAiIG1pbGxpc2Vjb25kc1xuIjsKICAgICAgICAgICAgICAgICAgIDw8IChkb3VibGUpKHQyIC0gdDEpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIiBzZWNvbmRzXG4iOwogICAgLy9Ob3cgd2UgdGVzdCB0aGF0IGJvdGggc29ydGVkIGxpc3RzIGFyZSBpZGVudGljYWwKICAgIHN0ZDo6Y291dCA8PCAiVGVzdGluZyB0aGF0IGJvdGggc29ydGVkIGxpc3RzIGFyZSB0aGUgc2FtZSI8PCBzdGQ6OmVuZGw7CiAgICBmb3IgKGludCBrPTA7IGs8IGFycmF5bGVuZ3RoOyBrKyspCiAgICB7CiAgICAgICAgaWYgKHJsaXN0MVtrXSAhPSB2bGlzdDFba10pCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlRoZSBsaXN0cyBhcmUgbm90IHRoZSBzYW1lXG4iOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfQogICAgCiAgICBzdGQ6OmNvdXQ8PCAiQm90aCBsaXN0cyBhcmUgdGhlIHNhbWVcbiI7CgogICAgcmV0dXJuIDA7Cn0K