快速排序
思想:
- 先在数据中找一个基准数据 : 找待排序数据序列的第一个, 随机数, 三位数取中
- 将数据按照基准数据分成两部分,前一段都比基准小,后一段都比基准大。
- 按照同样的思想分别处理前一段和后一段数据。
思考的两个问题:
(1)处理一段数据时,什么样的情况就认为这一段数据已经完全有序
(2) 如何将数据按照基准分成两部分
按照一个基准数据,将待排序数据段分成两部分
数据段为low到high之间的数据。先将基准数据(low位置)保存到tmp中,i=low,j = high。 在i<j的时候,重复执行以下两个过程。
(1)通过j从后往前找第一个比基准数据小的数据,找到后就将j位置的值赋值到i位置.
(2)通过i从前向后找第一个比基准数据大的数据,找到后就将i位置的值赋值到j位置.循环退出(i == j)后,将tmp中的基准数据存储到i位置。
void QuickSort(int* arr, int low, int high)
{
if (low < high)
{
int tmp = arr[low];
int i = low;
int j = high;
while (i < j)
{
while (i < j && arr[j] >= tmp)
{
j--;
}
if (i < j)
{
arr[i] = arr[j];
}
while (i < j && arr[i] <= tmp)
{
i++;
}
if (i < j)
{
arr[j] = arr[i];
}
}
arr[i] = tmp;
QuickSort(arr, low, i - 1);
QuickSort(arr, i + 1, high);
}
}