698 {
699 int result;
700 int32_t next_sample;
701 int32_t next_lesser;
702 int32_t prev_greater;
703 int32_t equal_count;
704 int32_t pivot;
705
707 return 0;
709 if (compar (array, static_cast<char *>(array) + size) < 0) {
710 return index >= 1 ? 1 : 0;
711 }
712 else {
713 return index >= 1 ? 0 : 1;
714 }
715 }
716 if (index < 0)
717 index = 0;
718 else if (index >=
count)
720 pivot =
static_cast<int32_t
>(rand () %
count);
722 next_lesser = 0;
723 prev_greater =
count;
724 equal_count = 1;
725 for (next_sample = 1; next_sample < prev_greater;) {
726 result =
727 compar (static_cast<char *>(array) + size * next_sample,
728 static_cast<char *>(array) + size * next_lesser);
729 if (result < 0) {
730 swap_entries (array, size, next_lesser++, next_sample++);
731
732 }
733 else if (result > 0) {
734 prev_greater--;
736 }
737 else {
738 equal_count++;
739 next_sample++;
740 }
741 }
742 if (index < next_lesser)
744 else if (index < prev_greater)
745 return next_lesser;
746 else
748 static_cast<char *>(array) + size * prev_greater,
749 count - prev_greater, size,
750 compar) + prev_greater;
751}
void swap_entries(void *array, size_t size, int32_t index1, int32_t index2)