Ejemplo n.º 1
0
void sort_quick(int n, int* a)
{
    if (n <= 1) return;

    int pivot = a[n-1];
    int m = partition(n, a, pivot);

    /**
     * now a[0,m) <= pivot < a[m, n)
     */

    /**
     * special case all <= pivot
     */
    if (m == n) {
        sort_quick(n-1, a);
        return;
    }

    /**
     * m can't be 0 now since a[0,m) at least contain pivot, must be 0<m<n
     */
    sort_quick(m, a);
    sort_quick(n-m, a+m);
}
Ejemplo n.º 2
0
/*-----------------------------------------------------------------------------------
 @array: array[first] ~ array[end] 
 @first: 第一个元素索引   一般为零
 @end  : 最后一个元素索引 一般为数组元素个数减1
-----------------------------------------------------------------------------------*/
void sort_quick(int array[],int first,int end)
{
    int q;

    if(first < end)
    {
        q = partition(array,first,end);
		//array_show(array,10,q);
		sort_quick(array,first,q-1);
		sort_quick(array,q+1,end);
    }
}
Ejemplo n.º 3
0
int main() {
    int arr[] = {6, 5, 3, 1, 8, 7, 2, 4};
    int len = sizeof(arr)/sizeof(int);

    array_display(arr, len);
    sort_quick(arr, len);
    printf("sort:\n");
    array_display(arr, len);
}
Ejemplo n.º 4
0
/*******************************************************************************
* Function Name  : sort_quick
* Description    : Sort table using quick sort algorithm.
* Input          : tab: table which will be sorted,
* 				   n: number of elements in table,
* 				   f: pointer to the function with sorting comparison.
* Output         : None.
* Return         : None.
*******************************************************************************/
void sort_quick(SORTEDTYPE *tab, uint16_t n, BOOL(*f)(SORTEDTYPE, SORTEDTYPE)) {
	SORTEDTYPE x = *(tab+n/2), tmp;
	uint16_t i = 0, j = n - 1;
	if(n == 1)
		return;
	do {
		while(f(*(tab+i), x)) i++;
		while(f(x, *(tab+j))) j--;
		if(i <= j) {
			tmp = *(tab+i);
			*(tab+i) = *(tab+j);
			*(tab+j) = tmp;
			i++;
			j--;
		}
	} while(i < j);
	if (0 < j) sort_quick(tab, j + 1, f);
	if (n > i) sort_quick(tab+i, n - i, f);
}
Ejemplo n.º 5
0
bool verify_sort_quick(int n) {

    for (int vs_len = 1; vs_len < 6; ++vs_len) {
        for (rpermut_begin(n, a, vs_len, vs); rpermut_next(n, a, vs_len, vs); ) {
            sort_quick(n, a);
            if (!is_sorted(n, a))
                return false;
        }
    }
    return true;
}
Ejemplo n.º 6
0
/*******************************************************************************
* Function Name  : sort_hybridquick
* Description    : Sort table using hybrid quick sort algorithm with help
*                  algorithm.
* Input          : tab: table which will be sorted,
* 				   n: number of elements in table,
* 				   f: pointer to the function with sorting comparison.
* Output         : None.
* Return         : None.
*******************************************************************************/
void sort_hybridquick(SORTEDTYPE *tab, uint16_t n, BOOL(*f)(SORTEDTYPE, SORTEDTYPE), void (*sort)(SORTEDTYPE*, uint16_t, BOOL(*f)(SORTEDTYPE, SORTEDTYPE))) {
	SORTEDTYPE x = *(tab+n/2), tmp;
	int i = 0, j = n - 1;
	if (n > 10) {
		do {
			while(f(*(tab+i), x)) i++;
			while(f(x, *(tab+j))) j--;
			if(i <= j) {
				tmp = *(tab+i);
				*(tab+i) = *(tab+j);
				*(tab+j) = tmp;
				i++;
				j--;
			}
		} while(i < j);
		if (0 < j) sort_quick(tab, j + 1, f);
		if (n > i) sort_quick(tab+i, n - i, f);
	} else {
		sort(tab, n, f);
	}
}
Ejemplo n.º 7
0
// best: O(n log n), worst: O(n2), avg: O(n log n)
void sort_quick(int *array, int left, int right) {
	int i = left, j = right;
	int pivot = array[left + (right - left) / 2];
	int tmp;
	// partition
	while(i <= j) {
		while(array[i] < pivot) {
			i++;
		}
		while(array[j] > pivot) {
			j--;
		}
		if(i <= j) {
			tmp = array[i];
			array[i] = array[j];
			array[j] = tmp;
			i++;
			j--;
		}
	}
	// recursion
	if(left < j) sort_quick(array, left, j);
	if(i < right) sort_quick(array, i, right);
}
Ejemplo n.º 8
0
    bool exprs_for_24(int a1, int a2, int a3, int a4)
    {
        int ar[4] = {a1, a2, a3, a4};
        sort_quick(4, ar);

        int ops[4] = {'+', '-', '*', '/'}; 
        int opr[3];
        Rpermut rp(3, opr, sizeof(ops)/sizeof(int), ops);

        int a, b, c, d;
        int op1, op2, op3;
        
        bool found = false;

        for (; std::next_permutation(ar, ar+4); ) {
            
            a = ar[0];
            b = ar[1];
            c = ar[2];
            d = ar[3];

            for (rp.begin(); !rp.ended; rp.next()) {
                op1 = opr[0];
                op2 = opr[1];
                op3 = opr[2];

                if (form1(a, b, c, d, op1, op2, op3) ||
                    form2(a, b, c, d, op1, op2, op3) ||
                    form3(a, b, c, d, op1, op2, op3) ||
                    form4(a, b, c, d, op1, op2, op3) ||
                    form5(a, b, c, d, op1, op2, op3))
                    found = true;
            }
        }

        return found;
    }
Ejemplo n.º 9
0
int test_sort()
{
	int i, result = 0, length, min_data_val, max_data_val;
	int *temp_data;
	int data[10];

	test_msg_start("Test Selection Sort - Preset Array");
		sort_set_array(data);
		sort_selection(data, 0, 9);
		result += test_sort_data(data, 0, 9);
		result += test_sort_data_loc(data);
	test_msg_end(result);

	test_msg_start("Test Selection Sort - Random Data");
		for(i = 0; i < SORT_TESTS; i++) {
			random_seed();
			min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
			max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
			length = random_int(500, 1000); /* get length of a new array */
			temp_data = malloc(sizeof(int) * length);
			sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
			sort_selection(temp_data, 0, length);
			result += test_sort_data(temp_data, 0, length);
			free(temp_data);
			temp_data = NULL;
		}
	test_msg_end(result);

	test_msg_start("Test Insertion Sort - Preset Array");
		sort_set_array(data);
		sort_insertion(data, 0, 9);
		result += test_sort_data(data, 0, 9);
		result += test_sort_data_loc(data);
	test_msg_end(result);

	test_msg_start("Test Insertion Sort - Random Data");
		for(i = 0; i < SORT_TESTS; i++) {
			random_seed();
			min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
			max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
			length = random_int(500, 1000); /* get length of a new array */
			temp_data = malloc(sizeof(int) * length);
			sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
			sort_insertion(temp_data, 0, length);
			result += test_sort_data(temp_data, 0, length);
			free(temp_data);
			temp_data = NULL;
		}
	test_msg_end(result);

	test_msg_start("Test Quick Sort (Recursive) - Preset Array");
		sort_set_array(data);
		sort_quick(data, 0, 9);
		result += test_sort_data(data, 0, 9);
		result += test_sort_data_loc(data);
	test_msg_end(result);

	test_msg_start("Test Quick Sort (Recursive) - Random Data");
		for(i = 0; i < SORT_TESTS; i++) {
			random_seed();
			min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
			max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
			length = random_int(500, 1000); /* get length of a new array */
			temp_data = malloc(sizeof(int) * length);
			sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
			sort_quick(temp_data, 0, length);
			result += test_sort_data(temp_data, 0, length);
			free(temp_data);
			temp_data = NULL;
		}
	test_msg_end(result);

	test_msg_start("Test Quick Sort - Preset Array");
		sort_set_array(data);
		sort_quick_norecurse(data, 0, 9);
		result += test_sort_data(data, 0, 9);
		result += test_sort_data_loc(data);
	test_msg_end(result);

	test_msg_start("Test Quick Sort - Random Data");
		for(i = 0; i < SORT_TESTS; i++) {
			random_seed();
			min_data_val = random_int(INT_MIN+1, (INT_MAX/2)-1);
			max_data_val = random_int(min_data_val, (INT_MAX/2)-1);
			length = random_int(500, 1000); /* get length of a new array */
			temp_data = malloc(sizeof(int) * length);
			sort_rnd_data_fill(temp_data, length, min_data_val, max_data_val);
			sort_quick_norecurse(temp_data, 0, length);
			result += test_sort_data(temp_data, 0, length);
			free(temp_data);
			temp_data = NULL;
		}
	test_msg_end(result);

	return result;
}
Ejemplo n.º 10
0
void sort_setup(){
	puts("");
	puts("");
	puts("introduce the sorting(排序) menu of the data structure and algorithms");
	puts("");
	sort_setup:
	puts("insert(插入排序) -------------------- 1");
	puts("bubble(冒泡排序) -------------------- 2");
	puts("select(选择排序) -------------------- 3");
	puts("shell(希尔排序) --------------------- 4");
	puts("quick(快速排序) --------------------- 5");
	puts("heap(堆排序) ------------------------ 6");
	puts("");
	puts("please input the index you want to go[1-4]");

	int index = 0;
	scanf("%d", &index);
	switch(index){
	case 1:
		puts("go to insert sort(插入排序)");
		before_sort();
		sort_insert();
		after_sort("insert sort(插入排序)");
		break;
	case 2:
		puts("go to bubble sort(冒泡排序)");
		before_sort();
		sort_bubble();
		after_sort("bubble sort(冒泡排序)");
		break;
	case 3:
		puts("go to select sort(选择排序)");
		before_sort();
		sort_select();
		after_sort("select sort(选择排序)");
		break;
	case 4:
//		puts("go to select sort(希尔排序)");
//		before_sort();
//		sort_shell();
//		after_sort("select sort(希尔排序)");
		puts("shell sort is to be continued ...");
		break;
	case 5:
		puts("go to select sort(快速排序)");
		before_sort();
		sort_quick();
		after_sort("select sort(快速排序)");
		break;
	case 6:
//		puts("go to select sort(堆排序)");
//		before_sort();
//		sort_heap();
//		after_sort("select sort(堆排序)");
		puts("heap sort is to be continued ...");
		break;

	default:
		puts("incorrect index you chosen, please chose again");
		goto sort_setup;
		break;
	}
}