算法(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;
}
}

浙公网安备 33010602011771号