1. 程式人生 > 實用技巧 >c++之排塊改進(隨機值)

c++之排塊改進(隨機值)

  • 數量少(5~25),插入排序很高效
  • 一個影響快排效率的因素就是: 基準值的選擇
  • 本文將演示一種隨之法的快排

原始碼

template <typename T>
void quick_sort(T arr[], int low, int high)
{
	if (low > high)
		return;

	int left = low;
	int right = high;
	srand((unsigned) time(NULL));
	int pivot_pos = (rand() % (high - low + 1)) + low;
	int key = arr[pivot_pos];

	while (left < right)
	{
		while (left < right && arr[right] >= key)
			--right;

		if (left < right)
			arr[left++] = arr[right];

		while (left < right && arr[left] < key)
			++left;

		if (left < right)
			arr[right--] = arr[left];
	}

	arr[left] = key;

	quick_sort(arr, low, left - 1);
	quick_sort(arr, left + 1, high);
}

核心原始碼

	srand((unsigned) time(NULL));
	int pivot_pos = (rand() % (high - low + 1)) + low;
	int key = arr[pivot_pos];

改為生成隨機數的方法來獲取基準數的索引。

缺點

很明顯,隨機值可能是 0 or max_pos,時間複雜度與改進前是一致的。