File: qsort.c

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (65 lines) | stat: -rw-r--r-- 1,491 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
** qsort.c
**
** 1998.12.09, Ullrich von Bassewitz
** 2015-06-21, Greg King
*/



#include <stdlib.h>



static void QuickSort (register unsigned char* Base, int Lo, int Hi,
                       register size_t Size,
                       int __fastcall__ (* Compare) (const void*, const void*))
/* Internal recursive function. Works with ints, but this shouldn't be
** a problem.
*/
{
    int I, J;

    /* Quicksort */
    while (Hi > Lo) {
        I = Lo + Size;
        J = Hi;
        while (I <= J) {
            while (I <= J && Compare (Base + Lo, Base + I) >= 0) {
                I += Size;
            }
            while (I <= J && Compare (Base + Lo, Base + J) < 0) {
                J -= Size;
            }
            if (I <= J) {
                _swap (Base + I, Base + J, Size);
                I += Size;
                J -= Size;
            }
        }
        if (J != Lo) {
            _swap (Base + J, Base + Lo, Size);
        }
        if (((unsigned) J) * 2 > (Hi + Lo)) {
            QuickSort (Base, J + Size, Hi, Size, Compare);
            Hi = J - Size;
        } else {
            QuickSort (Base, Lo, J - Size, Size, Compare);
            Lo = J + Size;
        }
    }
}



void __fastcall__ qsort (void* base, size_t nmemb, size_t size,
                         int __fastcall__ (* compare) (const void*, const void*))
/* Quicksort implementation */
{
    if (nmemb > 1) {
        QuickSort (base, 0, (nmemb-1) * size, size, compare);
    }
}