//核心思路:
//1. 取数组第一个元素作为基准值(iKey),执行一趟排序,让基准值左边的值都比基准值小,右边的值都比基准值大。然后递归重复执行。
//2. 先从右边开始,查找比基准值小的数,替换掉基准值所在的位置(a[i]),操作一次;再从左边开始,查找比基准值大的数,替换掉刚才右边查找的值(a[j])。 然后再从右边查找比基准值小的数,替换a[i],如此不断重复,直至i >= j后退出。i就是基准值(iKey)的最终位置,赋值。 这时就执行完一趟排序。
//3. 刚才基准值左边部分数组,递归执行一遍上面2的操作,基准值右边部分数组,也递归执行一遍。刚才的基准值不参与进下一次的排序。
//4. 完成之后,快速排序就完成了。
//5. 补充说明,需要对源数据做随机打乱处理,否则极端数据会导致时间复杂度退化为O(n平方),具体实现方式不做说明,可查看letcode 912. 排序数组
//=======================================================================================
void MyFastSort(int a[], int iMinIndex, int iMaxIndex, int iLen)
{
if (iMinIndex >= iMaxIndex) //左边索引和右边索引相遇后,退出
return;
if (iMinIndex < 0 || iMinIndex >= iLen) //冗错判断
return;
int i = iMinIndex;
int j = iMaxIndex;
int iKey = a[iMinIndex]; //取最左边作为基准值
while(i < j)
{
while(iKey <= a[j] && i < j)
j--;//从右边开始查找,小于基准值的数
a[i] = a[j]; //替换掉基准值所在的位置
while(iKey >= a[i] && i < j)
i++; //从左边开始查找,大于基准值的数
a[j] = a[i]; //替换掉前面查出的数的所在的位置
}
a[i] = iKey; //确定基准值应该在哪
MyFastSort(a, iMinIndex, i - 1, iLen); //左半部分做同样的递归处理,不包含基准值
MyFastSort(a, i + 1, iMaxIndex, iLen); //右半部分做同样的递归处理,不包含基准值
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
int iLen = sizeof(a) / sizeof(a[0]);
MyFastSort(a, 0, iLen - 1, iLen);
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
cout << a[i] << ", ";
}
return 0;
}