Exemplo n.º 1
0
static inline void
quick_sort_recursive(void *base, uint32 left, uint32 right,
    uint32 csize, sint32 (*compare)(const void *, const void *))
{
    void *ptr_l;
    void *ptr_r;
    void *ptr_m;
    uint32 median;

    assert_exit(sort_parameters_legal_p(base, csize, csize, compare));

    ptr_l = base + left * csize;
    ptr_r = base + right * csize;

    if (left + 2 < right) {
        ptr_m = quick_sort_obtain_median(base, left, right, csize, compare);
        sort_cell_swap(ptr_m, ptr_r - csize, csize);

        ptr_m = ptr_r - csize;
        ptr_r = ptr_m;

        while (true) {
            do {
                ptr_l += csize;
            } while (compare(ptr_m, ptr_l) > 0);
            do {
                ptr_r -= csize;
            } while (compare(ptr_m, ptr_r) < 0);

            if (ptr_l < ptr_r) {
                sort_cell_swap(ptr_l, ptr_r, csize);
            } else {
                break;
            }
        }

        sort_cell_swap(ptr_l, ptr_m, csize);
        median = (ptr_l - base) / csize;

        quick_sort_recursive(base, left, median - 1, csize, compare);
        quick_sort_recursive(base, median + 1, right, csize, compare);
    } else if (left + 2 == right) {
        quick_sort_obtain_median(base, left, right, csize, compare);
    } else if (left + 1 == right && compare(ptr_l, ptr_r) > 0) {
        sort_cell_swap(ptr_l, ptr_r, csize);
    }
}
Exemplo n.º 2
0
void quick_sort_recursive(int (*digits)[2], int start, int end)
{
    if(start >= end)
        return ;

    //int pos = start + (rand() % (end-start+1));
    int tmp[2];
    /*
    tmp[0] = digits[pos][0];
    tmp[1] = digits[pos][1];
    digits[pos][0] = digits[end][0];
    digits[pos][1] = digits[end][1];
    digits[end][0] = tmp[0];
    digits[end][1] = tmp[1];
    */

    int mid = digits[end][0];
    int left = start, right = end-1;
    while(left < right)
    {
        while(digits[left][0] < mid && left < right)
            left++;
        while(digits[right][0] >= mid && left < right)
            right--;
        tmp[0] = digits[left][0];
        tmp[1] = digits[left][1];
        digits[left][0] = digits[right][0];
        digits[left][1] = digits[right][1];
        digits[right][0] = tmp[0];
        digits[right][1] = tmp[1];
    }
    if(digits[left][0] >= digits[end][0])
    {
        tmp[0] = digits[left][0];
        tmp[1] = digits[left][1];
        digits[left][0] = digits[end][0];
        digits[left][1] = digits[end][1];
        digits[end][0] = tmp[0];
        digits[end][1] = tmp[1];
    }
    else
        left++;
    quick_sort_recursive(digits, start, left-1);
    quick_sort_recursive(digits, left+1, end);
}
Exemplo n.º 3
0
void
quick_sort(void *base, uint32 size, uint32 csize,
    sint32 (*compare)(const void *, const void *))
{
    if (sort_parameters_legal_p(base, size, csize, compare)) {
        quick_sort_recursive(base, 0, size - 1, csize, compare);
        assert_exit(sort_data_sorted_p(base, size, csize, compare));
    }
}
Exemplo n.º 4
0
void quick_sort_recursive(int arr[], int start, int end) {
	if (start >= end)
		return;
	int mid = arr[end];
	int left = start, right = end - 1;
	while (left < right) {
		while (arr[left] < mid && left < right)
			left++;
		while (arr[right] >= mid && left < right)
			right--;
		swap(&arr[left], &arr[right]);
	}
	if (arr[left] >= arr[end])
		swap(&arr[left], &arr[end]);
	else
		left++;
	quick_sort_recursive(arr, start, left - 1);
	quick_sort_recursive(arr, left + 1, end);
}
Exemplo n.º 5
0
void quick_sort(int arr[], int len) {
	quick_sort_recursive(arr, 0, len - 1);
}
Exemplo n.º 6
0
void quick_sort(int (*digits)[2], int len)
{
    //srand((unsigned)time(NULL));
    quick_sort_recursive(digits, 0, len-1);
}