2010-08-09 13:28:56 +00:00
|
|
|
#ifndef NALL_SORT_HPP
|
|
|
|
#define NALL_SORT_HPP
|
|
|
|
|
2012-01-15 08:29:57 +00:00
|
|
|
#include <algorithm>
|
2010-08-09 13:28:56 +00:00
|
|
|
#include <nall/utility.hpp>
|
|
|
|
|
|
|
|
//class: merge sort
|
|
|
|
//average: O(n log n)
|
|
|
|
//worst: O(n log n)
|
|
|
|
//memory: O(n)
|
|
|
|
//stack: O(log n)
|
|
|
|
//stable?: yes
|
|
|
|
|
2012-01-26 06:50:09 +00:00
|
|
|
//note: merge sort was chosen over quick sort, because:
|
|
|
|
//* it is a stable sort
|
|
|
|
//* it lacks O(n^2) worst-case overhead
|
|
|
|
|
|
|
|
#define NALL_SORT_INSERTION
|
|
|
|
//#define NALL_SORT_SELECTION
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
namespace nall {
|
2012-01-26 06:50:09 +00:00
|
|
|
template<typename T, typename Comparator>
|
|
|
|
void sort(T list[], unsigned size, const Comparator &lessthan) {
|
|
|
|
if(size <= 1) return; //nothing to sort
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
//use insertion sort to quickly sort smaller blocks
|
2012-01-26 06:50:09 +00:00
|
|
|
if(size < 64) {
|
|
|
|
#if defined(NALL_SORT_INSERTION)
|
|
|
|
for(signed i = 1, j; i < size; i++) {
|
|
|
|
T copy = std::move(list[i]);
|
|
|
|
for(j = i - 1; j >= 0; j--) {
|
Update to v092 release.
In the release thread, byuu says:
The first official release of higan has been posted. higan is the
new name for bsnes, and it continues with the latter's version
numbering.
Note that as of now, bsnes still exists. It's a module distributed
inside of higan. bsnes is now specific to my SNES emulator.
Due to last minute changes to the emulator interface, and missing
support in ananke, I wasn't able to include Cydrak's Nintendo DS
emulator dasShiny in this build, but I hope to do so in the next
release.
http://code.google.com/p/higan/downloads/list
For both new and experienced users, please read the higan user guide
first:
http://byuu.org/higan/user-guide
In the v091 WIP thread, byuu says:
r15->r16:
- BS-X MaskROM handling (partial ... need to split bsx/flash away
from sfc/chip, restructure code - it requires tagging the base
cart markup for now, but it needs to parse the slotted cart
markup)
- phoenixflags / phoenixlink += -m32
- nall/sort stability
- if(input.poll(scancode[activeScancode]) == false) return;
- MSU1 / USART need to use interface->path(1)
- MSU1 needs to use Markup::Document, not XML::Document
- case-insensitive folder listings
- remove nall/emulation/system.hpp files (move to ananke)
- remove rom/ram id= checks with indexing
X have cores ask for manifest.bml (skipped for v092's release, too
big a change)
- rename compatibility profile to balanced (so people don't assume
it has better compatibility than accuracy)
2013-01-14 12:10:20 +00:00
|
|
|
if(!lessthan(copy, list[j])) break;
|
2012-01-26 06:50:09 +00:00
|
|
|
list[j + 1] = std::move(list[j]);
|
|
|
|
}
|
|
|
|
list[j + 1] = std::move(copy);
|
|
|
|
}
|
|
|
|
#elif defined(NALL_SORT_SELECTION)
|
|
|
|
for(unsigned i = 0; i < size; i++) {
|
2010-08-09 13:28:56 +00:00
|
|
|
unsigned min = i;
|
2012-01-26 06:50:09 +00:00
|
|
|
for(unsigned j = i + 1; j < size; j++) {
|
|
|
|
if(lessthan(list[j], list[min])) min = j;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
2012-01-15 08:29:57 +00:00
|
|
|
if(min != i) std::swap(list[i], list[min]);
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
2012-01-26 06:50:09 +00:00
|
|
|
#endif
|
2010-08-09 13:28:56 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//split list in half and recursively sort both
|
2012-01-26 06:50:09 +00:00
|
|
|
unsigned middle = size / 2;
|
|
|
|
sort(list, middle, lessthan);
|
|
|
|
sort(list + middle, size - middle, lessthan);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
|
|
|
//left and right are sorted here; perform merge sort
|
2012-01-26 06:50:09 +00:00
|
|
|
T *buffer = new T[size];
|
|
|
|
unsigned offset = 0, left = 0, right = middle;
|
|
|
|
while(left < middle && right < size) {
|
Update to v092 release.
In the release thread, byuu says:
The first official release of higan has been posted. higan is the
new name for bsnes, and it continues with the latter's version
numbering.
Note that as of now, bsnes still exists. It's a module distributed
inside of higan. bsnes is now specific to my SNES emulator.
Due to last minute changes to the emulator interface, and missing
support in ananke, I wasn't able to include Cydrak's Nintendo DS
emulator dasShiny in this build, but I hope to do so in the next
release.
http://code.google.com/p/higan/downloads/list
For both new and experienced users, please read the higan user guide
first:
http://byuu.org/higan/user-guide
In the v091 WIP thread, byuu says:
r15->r16:
- BS-X MaskROM handling (partial ... need to split bsx/flash away
from sfc/chip, restructure code - it requires tagging the base
cart markup for now, but it needs to parse the slotted cart
markup)
- phoenixflags / phoenixlink += -m32
- nall/sort stability
- if(input.poll(scancode[activeScancode]) == false) return;
- MSU1 / USART need to use interface->path(1)
- MSU1 needs to use Markup::Document, not XML::Document
- case-insensitive folder listings
- remove nall/emulation/system.hpp files (move to ananke)
- remove rom/ram id= checks with indexing
X have cores ask for manifest.bml (skipped for v092's release, too
big a change)
- rename compatibility profile to balanced (so people don't assume
it has better compatibility than accuracy)
2013-01-14 12:10:20 +00:00
|
|
|
if(!lessthan(list[right], list[left])) {
|
2012-01-26 06:50:09 +00:00
|
|
|
buffer[offset++] = std::move(list[left++]);
|
2010-08-09 13:28:56 +00:00
|
|
|
} else {
|
2012-01-26 06:50:09 +00:00
|
|
|
buffer[offset++] = std::move(list[right++]);
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
}
|
2012-01-26 06:50:09 +00:00
|
|
|
while(left < middle) buffer[offset++] = std::move(list[left++]);
|
|
|
|
while(right < size) buffer[offset++] = std::move(list[right++]);
|
2010-08-09 13:28:56 +00:00
|
|
|
|
2012-01-26 06:50:09 +00:00
|
|
|
for(unsigned i = 0; i < size; i++) list[i] = std::move(buffer[i]);
|
2010-08-09 13:28:56 +00:00
|
|
|
delete[] buffer;
|
|
|
|
}
|
2012-01-26 06:50:09 +00:00
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
void sort(T list[], unsigned size) {
|
|
|
|
return sort(list, size, [](const T &l, const T &r) { return l < r; });
|
|
|
|
}
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|