快速排序算法

快速排序算法的关键在于先在数组中选择一个数,接下来把数组中的数字分为两部分,比选择的数字小的数移动到左边,比选择的数字大的在右边--<<剑指offer>>

1.第一次直接写的快速排序算法,太稚嫩了hhhh

void QuestSore1(int arr[], int l, int r)
{
	if (arr == nullptr)
		return;
	int left = l;//左值
	int right = r;//右值
	int base = arr[left]; //基准数为最左
	bool move_right = true;//判断是移动left还是移动right

	while (left < right)
	{
		if (move_right)
		{
			if (arr[right] < base)
			{
				arr[left] = arr[right];
				left = left + 1;//移动left
				move_right = false;//下一次判断left
			}
			else
			{
				right--;
				move_right = true;
			}
		}
		else
		{
			if (arr[left] < base)
			{
				left++;
				move_right = false;
			}
			else
			{
				arr[right] = arr[left];
				right--;
				move_right = true;
			}
		}
	}

	arr[left] = base;
	if (left - l >= 1)
	{
		QuestSore1(arr, 1, left - 1);
	}
	if (r - right >= 1)
	{
		QuestSore1(arr, right + 1, r);
	}
}

 2.以最左边的数为基准,从前往后遍历比较.

void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp
}
int division(int number[],int left,int right)
{
int base=left;
int basevalue=number[left];
while (left < right)
	{
		while (left<right && numbers[right]>= basevalue)//寻找小于base的数
			right--;
		
		while (left < right && numbers[left] <= basevalue)//寻找大于base的数
			left++;

		if (left < right)//如果不小于则说明是要出循环与arr[base]交换
			swap(numbers[left], numbers[right]);
	}
	swap(numbers[base], numbers[left]);
	return left;
}

void QuickSort(int *numbers, int left, int right)
{
	if (left < right)
	{
		int pivot = division(numbers, left, right);//找到中心位置
        if(pivotloc-1-left>=1)
		QuickSort(numbers, left, pivot - 1);
        if (right-pivotloc -1  >= 1)
		QuickSort(numbers, pivot + 1,right);
	}

}

3.在<<剑指offer>>中所看到的,RandomInRange()函数将随机选取一个数,从前往后遍历,每遍历到一个新元素,先进行甄别,属于小于枢纽元的话,把他交给数组的left部分,否则right部分。具体如何交给left呢?那就是先让left增加,这个时候left部分会持有一个不属于它的元素(大于等于pivot),这时候把这个元素和才遍历到的元素交换就行了,而如果这个元素本来就属于right部分,则不用做任何处理。

参考:快速排序 一次遍历partition的实现_zdy0_2004的博客-CSDN博客

int RandomInRange(int start,int end)
{
	int random = rand() % (end - start + 1) + start;
	return random;
}
void swap(int &a, int &b)//交换
{
	int temp = a;
	a = b;
	b = temp;
}
int Partition(int data[], int length, int start, int end)//该函数的功能是使取的数的左边都比选择的数字小,右边都比该函数大
{
	if (data == nullptr || length <= 0 || start < 0 || end >= length)
		throw new std::exception("Invalid Parameters");

	int index = RandomInRange(start, end);
	swap(data[index], data[end]);//保存在最后面,因为必须从start遍历到end,存储选中的数字必须位于最左或者最右
	int small = start - 1;//这个是要交换的数字,有点相当于左指针的那个意思(大概)
	for (index = start; index < end; index++)//开始从前往后遍历
	{
		if (data[index] < data[end])//小于的话,要放在
		{
			small++;
			if (index != small)//不能等于,如果等于的话就说明没有一个大于选择中的数,不能交换
				swap(data[index], data[small]);
		}
	}
	small++;//要大于选中的数,交换后放在选择的数的右边
	swap(data[small], data[end]);//把选择的数放在应该放的位置

	return small;
}
void QuickSort(int data[], int length, int start, int end)
{
	if (start == end)
		return;
	int index = Partition(data, length, start, end);
	if (index>start)
		QuickSort(data, length, start, index - 1);
	if (index < end)
		QuickSort(data, length, index + 1, end);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值