算法(6)-快排-C++

      快排在排序中的名声如雷贯耳。其实就是在L-R上随机取一个数作为划分值,然后分三个区域,大于,小于,等于区域,在大于、小于区域上分别做递归排序。就是荷兰国旗的拓展。如果懂了荷兰国旗,这个就是小菜一碟。
三步:

1.L-R不能越界
2.L-R位置中 等概率随机选一个"位置" L+(int)(Math.random()*(R-L+1))
     与R位置的数交换 放到最后的地方
3.partition 返回的是等于区域的左右边界

void patition(int arr[], int l, int r,int m_P[])
{	
	int index = l;
	int more = r;//  >区    从n-1开始
	int less = l - 1;//<区    从-1开始
	//区分值 arr[r]
	while (index < more)
	{
		//《区
		if (arr[index] < arr[r]) { swap(arr, ++less, index++); }
		//>区
		if (arr[index] > arr[r]) { swap(arr, --more, index); }
		else { index++; }//等于区
	}
	swap(arr, more, r);
	m_P[0] = less + 1;
	m_P[1] = more;
	
}
void quickProcess(int arr[], int l, int r)
{
	srand((int)time(0));
	if (l < r)
	{
	//1最后一个值放在任意位置上,作为区分值 
		int m_p = 0;
		//(l,r)随意取了一个数
		m_p = l + rand() % (r - l);
		swap(arr, m_p,r);
    //2.==区位置
		int * mp=new int[2];
		patition(arr, l, r, mp);
	//3.左右递归
		quickProcess(arr,l, mp[0]-1);//坐标 -1
		quickProcess(arr, mp[1] + 1,r);
		delete[]mp;
	}
}

void quickSort_main(int arr[], int m_num)
{
	cout << "quickSort******************" << endl;
	if (arr == NULL || m_num < 2) { return; }
	quickProcess(arr, 0, m_num - 1);
	for (int i = 0; i < m_num; i++)
	{
		cout << arr[i] << endl;
	}

}

 

posted @ 2020-02-05 09:58  jasmineTang  阅读(155)  评论(0)    收藏  举报