[ create a new paste ] login | about

Link: http://codepad.org/w0YM9cnL    [ raw code | output | fork ]

C++, pasted on Oct 2:
#include <iostream>
#include <string>
using std::string;
using std::cout;



// сортировка слиянием
template<typename T>
T* merge_sort(T* lst, T** ptail, bool (*pred_cmp)(const T*, const T*)) {

   if((lst == NULL) || (lst->next == NULL))
        return lst;

   T* ptr, *next, *tail;
   T* iter = lst;
   T* last = lst;

   ptr = next = tail = NULL;
   for(T* tmp = lst; (tmp != NULL) && (tmp->next != NULL); tmp = tmp->next->next) {
        last = iter;
        iter = iter->next;
   }
   last->next = NULL;

   lst  = merge_sort(lst,  ptail, pred_cmp);
   iter = merge_sort(iter, ptail, pred_cmp);

   for(; (lst != NULL) || (iter != NULL); ) {
       if(iter == NULL) {
           next = lst;
           lst  = lst->next;
       } else if(lst == NULL) {
           next = iter;
           iter = iter->next;
       } else if((*pred_cmp)(lst, iter)){
           next = lst;
           lst  = lst->next;
       } else {
           next = iter;
           iter = iter->next;
       }

       if(ptr == NULL) 
            ptr = next;
       else 
            tail->next = next;
 
       next->prev = tail;
       tail = next;
   }	
   *ptail = tail;
    return ptr;
}





// здесь кусок кода для наглядности сортировки

typedef unsigned short int USI;

struct School {
  USI number,primary,middle,senior;
  string district;

  School *next;
  School *prev;
} info;


// добавление в хвост
void AddBack(School** head, School** tail, USI number, USI primary, 
             USI middle, USI senior, const string& district) {

  School* snew   = new School();
  snew->number   = number;
  snew->primary  = primary;
  snew->middle   = middle;
  snew->senior   = senior;
  snew->district = district;

  if(*head != NULL) {
      snew->next = snew;
      snew->prev = *tail;
      snew->prev->next = snew;
      *tail = snew;
  } else {
     *head = snew;
      snew->next = *head;
      snew->prev = NULL;
      *tail = *head;
   }
   (*tail)->next = NULL;
}


// удаление из головы
void  PopHead(School** head, School** tail) {
    if(*head == NULL)
         return;
    if(*head == *tail) {
         delete *head;
         *head = *tail = NULL;
         return;
    }
    School* tmp = *head;
    *head = (*head)->next;
    (*head)->prev = NULL;
    delete tmp;
}



// 
bool func_cmp(const School* a, const School* b) {
   return (a->primary+a->middle+a->senior) > (b->primary+b->middle+b->senior);
}



int  main(void) {
	School* head = NULL;
	School* tail = NULL;

	//...
	for(int i = 1; i <= 255; i++) {
		AddBack(&head, &tail, (USI)i, (USI)(rand()%255), 
                        (USI)(rand()%255), (USI)(rand()%255), "Sample");
	}

	// отсортируем список
	head = merge_sort(head, &tail, &func_cmp);

	//...
	for(;head != NULL; PopHead(&head, &tail))
             cout << "sum: " << (head->primary+head->middle+head->senior) << std::endl;
	return 0;
}


Output:
sum: 742
sum: 659
sum: 656
sum: 643
sum: 632
sum: 614
sum: 611
sum: 605
sum: 602
sum: 599
sum: 590
sum: 590
sum: 587
sum: 586
sum: 581
sum: 580
sum: 575
sum: 574
sum: 573
sum: 573
sum: 573
sum: 571
sum: 566
sum: 559
sum: 551
sum: 551
sum: 550
sum: 548
sum: 545
sum: 542
sum: 541
sum: 539
sum: 539
sum: 538
sum: 536
sum: 534
sum: 533
sum: 532
sum: 531
sum: 531
sum: 530
sum: 529
sum: 527
sum: 525
sum: 522
sum: 520
sum: 520
sum: 520
sum: 517
sum: 517
sum: 511
sum: 510
sum: 506
sum: 504
sum: 504
sum: 499
sum: 498
sum: 493
sum: 491
sum: 490
sum: 486
sum: 485
sum: 483
sum: 477
sum: 477
sum: 476
sum: 473
sum: 472
sum: 471
sum: 470
sum: 467
sum: 466
sum: 465
sum: 464
sum: 464
sum: 461
sum: 458
sum: 458
sum: 457
sum: 454
sum: 454
sum: 453
sum: 451
sum: 449
sum: 449
sum: 448
sum: 448
sum: 445
sum: 444
sum: 443
sum: 442
sum: 440
sum: 437
sum: 436
sum: 435
sum: 434
sum: 429
sum: 428
sum: 428
sum: 424
sum: 424
sum: 422
sum: 421
sum: 421
sum: 420
sum: 420
sum: 420
sum: 419
sum: 419
sum: 412
sum: 412
sum: 410
sum: 409
sum: 408
sum: 406
sum: 406
sum: 402
sum: 402
sum: 401
sum: 401
sum: 399
sum: 397
sum: 391
sum: 391
sum: 389
sum: 384
sum: 384
sum: 384
sum: 383
sum: 382
sum: 381
sum: 377
sum: 373
sum: 373
sum: 371
sum: 370
sum: 369
sum: 366
sum: 361
sum: 360
sum: 358
sum: 355
sum: 354
sum: 354
sum: 353
sum: 352
sum: 350
sum: 349
sum: 349
sum: 348
sum: 347
sum: 346
sum: 344
sum: 342
sum: 337
sum: 337
sum: 336
sum: 334
sum: 334
sum: 333
sum: 333
sum: 329
sum: 328
sum: 327
sum: 327
sum: 327
sum: 326
sum: 326
sum: 325
sum: 324
sum: 323
sum: 322
sum: 321
sum: 321
sum: 319
sum: 310
sum: 310
sum: 309
sum: 307
sum: 304
sum: 302
sum: 300
sum: 297
sum: 296
sum: 294
sum: 293
sum: 293
sum: 292
sum: 291
sum: 290
sum: 287
sum: 287
sum: 287
sum: 286
sum: 286
sum: 285
sum: 283
sum: 282
sum: 282
sum: 280
sum: 280
sum: 279
sum: 277
sum: 277
sum: 274
sum: 272
sum: 268
sum: 268
sum: 268
sum: 266
sum: 264
sum: 264
sum: 263
sum: 260
sum: 260
sum: 259
sum: 257
sum: 256
sum: 255
sum: 251
sum: 250
sum: 239
sum: 230
sum: 230
sum: 228
sum: 226
sum: 216
sum: 214
sum: 214
sum: 208
sum: 205
sum: 203
sum: 201
sum: 198
sum: 196
sum: 185
sum: 184
sum: 179
sum: 172
sum: 171
sum: 170
sum: 168
sum: 166
sum: 160
sum: 145
sum: 134
sum: 111
sum: 109
sum: 108
sum: 105
sum: 100
sum: 80
sum: 71
sum: 65
sum: 47


Create a new paste based on this one


Comments: