core/smn_sorting.cpp
changeset 1917 3b9449e1cb98
parent 1704 796db70f03c7
child 1947 e73a1e51833b
     1.1 --- a/core/smn_sorting.cpp	Sun Mar 02 23:58:33 2008 +0000
     1.2 +++ b/core/smn_sorting.cpp	Mon Mar 03 06:28:41 2008 +0000
     1.3 @@ -86,8 +86,26 @@
     1.4  {
     1.5  	Sort_Ascending = 0,
     1.6  	Sort_Descending = 1,
     1.7 +	Sort_Random = 2,
     1.8  };
     1.9  
    1.10 +void sort_random(cell_t *array, cell_t size)
    1.11 +{
    1.12 +	srand((unsigned int)time(NULL));
    1.13 +
    1.14 +	for (int i = size-1; i > 0; i--)
    1.15 +	{
    1.16 +        int n = (rand() % i) + 1;
    1.17 +
    1.18 +		if (array[i] != array[n]) 
    1.19 +		{
    1.20 +			array[i] ^= array[n];
    1.21 +			array[n] ^= array[i];
    1.22 +			array[i] ^= array[n];
    1.23 +		}
    1.24 +	}
    1.25 +}
    1.26 +
    1.27  int sort_ints_asc(const void *int1, const void *int2)
    1.28  {
    1.29  	return (*(int *)int1) - (*(int *)int2);
    1.30 @@ -109,9 +127,15 @@
    1.31  	if (type == Sort_Ascending)
    1.32  	{
    1.33  		qsort(array, array_size, sizeof(cell_t), sort_ints_asc);
    1.34 -	} else {
    1.35 +	} 
    1.36 +	else if (type == Sort_Descending)
    1.37 +	{
    1.38  		qsort(array, array_size, sizeof(cell_t), sort_ints_desc);
    1.39  	}
    1.40 +	else
    1.41 +	{
    1.42 +		sort_random(array, array_size);
    1.43 +	}
    1.44  
    1.45  	return 1;
    1.46  }
    1.47 @@ -157,9 +181,15 @@
    1.48  	if (type == Sort_Ascending)
    1.49  	{
    1.50  		qsort(array, array_size, sizeof(cell_t), sort_floats_asc);
    1.51 -	} else {
    1.52 +	}
    1.53 +	else if (type == Sort_Descending)
    1.54 +	{
    1.55  		qsort(array, array_size, sizeof(cell_t), sort_floats_desc);
    1.56  	}
    1.57 +	else
    1.58 +	{
    1.59 +		sort_random(array, array_size);
    1.60 +	}
    1.61  
    1.62  	return 1;
    1.63  }
    1.64 @@ -217,9 +247,15 @@
    1.65  	if (type == Sort_Ascending)
    1.66  	{
    1.67  		qsort(array, array_size, sizeof(cell_t), sort_strings_asc);
    1.68 -	} else {
    1.69 +	} 
    1.70 +	else if (type == Sort_Descending)
    1.71 +	{
    1.72  		qsort(array, array_size, sizeof(cell_t), sort_strings_desc);
    1.73  	}
    1.74 +	else
    1.75 +	{
    1.76 +		sort_random(array, array_size);
    1.77 +	}
    1.78  
    1.79  	/* END HACKHACK - restore what we damaged so Pawn doesn't throw up.
    1.80  	 * We'll browse through each index of the array and patch up the distance.
    1.81 @@ -392,6 +428,20 @@
    1.82  	return strcmp((char *) str2, (char *) str1);
    1.83  }
    1.84  
    1.85 +void sort_adt_random(CellArray *cArray)
    1.86 +{
    1.87 +	size_t arraysize = cArray->size();
    1.88 +
    1.89 +	srand((unsigned int)time(NULL));
    1.90 +
    1.91 +	for (int i = arraysize-1; i > 0; i--)
    1.92 +	{
    1.93 +        int n = (rand() % i) + 1;
    1.94 +
    1.95 +		cArray->swap(i, n);
    1.96 +	}
    1.97 +}
    1.98 +
    1.99  static cell_t sm_SortADTArray(IPluginContext *pContext, const cell_t *params)
   1.100  {
   1.101  	CellArray *cArray;
   1.102 @@ -405,6 +455,14 @@
   1.103  	}
   1.104  
   1.105  	cell_t order = params[2];
   1.106 +	
   1.107 +	if (order == Sort_Random)
   1.108 +	{
   1.109 +		sort_adt_random(cArray);
   1.110 +
   1.111 +		return 1;
   1.112 +	}
   1.113 +
   1.114  	cell_t type = params[3];
   1.115  	size_t arraysize = cArray->size();
   1.116  	size_t blocksize = cArray->blocksize();