快速排序(hoare法,刨坑法,前後指針法)

單趟排序:將比key小和相等的放在左邊,將比key大和相等的放到右邊

單趟排序的變形

1.hoare法,2.刨坑法,3.前後指針法。

hoare法

最右邊做key,左邊先走;左邊做key,右邊先走。

void Swap(int *a, int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int HoareSort(int *a, int begin,int end)
{
	//end做key,左邊先走,begin做key,右邊先走

	int key = a[end];
	int keyindex = end;
	while (begin < end)
	{
		//begin找大
		while (begin < end && a[begin] <= key)
		{
			++begin;
		}
		while (begin < end && a[end] >= key)
		{
			--end;
		}
		Swap(&a[begin], &a[end]);
	}
	Swap(&a[begin], &a[keyindex]);
	return begin;
}

刨坑法

key=6

int PitSort(int *a, int begin, int end)
{
	int key = a[end];
	while (begin < end)
	{
		//begin找大
		while (begin < end && a[begin] <= key)
		{
			++begin;
		}
		a[end] = a[begin];//找到大扔到右邊的坑裏去
		while (begin < end && a[end] >= key)
		{
			--end;
		}
		a[begin] = a[end];//找到小就扔到左邊的坑裏去
	}
	a[begin]=key;
	return begin;
}

3. 前後指針版本

//前後指針版本
int PrevCurSort(int *a, int begin, int end)
{
	int cur = begin;
	int prev=begin-1;
	int key = a[end];

	while (cur < end)//遇到key的位置就結束了
	{
		if (a[cur] < key && ++prev != cur)
			Swap(&a[cur], &a[prev]);
		++cur;
	}
	++prev;
	Swap(&a[prev],&a[end]);

	return prev;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章