使用vector实现非递归快排

    使用vector比较方便,不需要再实现栈,所以直接使用pair<int, int>来保存快排中需要排序的区间,直接使用vector< pair<int, int> >比较方便。

直接上代码吧,也没技术含量。

 

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

/*int partition2(int arr[], int begin, int end)  //这个函数不知道哪里错了~~~
{
	int key = arr[begin];
	int left = begin -1;
	int right = end + 1;

	while(true)
	{
		do{
			--right;
		}while(left < right && arr[right] > key);

		do{
			++left;
		}while(left < right && arr[left] <= key);

		if(left < right)   //如果向右和向左都扫到了一个和key相等的元素呢?这种排序就会出现错误
		{
			int temp = arr[left];
			arr[left] = arr[right];
			arr[right] = temp;
		}
		else
		{
			return right;
		}
	}
}*/

int partition(int arr[], int low, int high)
{
	int key = arr[low];
	while(low < high)
	{
		while((low < high) && (arr[high] > key))
			high-- ;
		arr[low] = arr[high];
		while( (low<high) && (arr[low] <= key))
			low++ ;
		arr[high] = arr[low];
	}
	arr[low] = key;
	return low;
}

int partition1(int arr[], int begin, int end)
{
	srand((unsigned)time(NULL));
	int element = rand()%(end-begin+1) + begin;
	int tmp;
	tmp = arr[end]; arr[end]= arr[element]; arr[element] = tmp;

	int i = begin-1;  int j;
	int key  = arr[end];
	for(j = begin; j<end; j++)
	{
		if(arr[j] <= key)
		{
			tmp = arr[i+1];
			arr[i+1] = arr[j];
			arr[j] = tmp;
			++i;
		}
	}
	tmp = arr[end];
	arr[end] = arr[i+1];
	arr[i+1] = tmp;
//cout << "  value of i: " << i << endl;
	return i+1;
}
//递归快排
void quick_sort(int arr[], int begin, int end)
{
	if(begin < end)
	{
		int r = partition1(arr, begin, end);
		/*cout << "r " <<  r << " begin " << begin << "  " << end << endl;
	for(int i =begin; i< end; i++)
		cout << arr[i] << " ";
	cout << endl;*/
		quick_sort(arr, begin, r-1);
		quick_sort(arr, r+1, end);
	}
}
//非递归快排
void quick_Sort_stack(int arr[], int left, int  right)
{
	vector< pair<int, int> > stac;
	pair< int , int > tmp;
	int r = partition1(arr, left, right);
	if(r > left+1)
	{
		tmp = make_pair(left, r-1);
		stac.push_back(tmp);
	}
	if(right > r+1)
	{
		tmp = make_pair(r+1, right);
		stac.push_back(tmp);
	}
	while( !stac.empty() )
	{
		pair<int, int>  read;
		read = stac[stac.size()-1];
		r = partition1(arr, read.first, read.second);
//cout << "first " << read.first << " second " << read.second << endl;
		stac.pop_back();
		if(r > read.first+1)
		{
			tmp = make_pair( read.first, r-1);
			stac.push_back(tmp);
		}
		if( read.second > r+1)
		{
			tmp = make_pair( r+1, read.second);
			stac.push_back(tmp);
		}
	}
}

int main()
{
	int length = 0;
	int *arr;
	int i;
	
	cout << "input the length of array" << endl;
	scanf("%d", &length);

	arr = (int *)malloc(sizeof(int) * length);
	for(i=0; i< length; i++)
	{
		arr[i] = rand()%100;
		cout << arr[i]<< " " ;
	}
	cout << endl;

	//quick_sort(arr, 0, length-1);
	quick_Sort_stack(arr, 0, length-1);

	for(i=0; i< length; i++)
	{
		cout << arr[i]<< " " ;
	}
	cout << endl;
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值