基本思想:快速排序是从待排记录中选出一个“基准”,将待排记录分成两个子待排记录(左边子待排记录的都小于这个基准,右边子待排记录都大于这个基准),一直重复这个过程,直到待排记录变成有序的记录为止。
算法步骤:
1 .从数列中挑出一个元素,称为 “基准”(pivot);
2. 重新排序数列。所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。完成前面的操作之后,基准放在数列的中间位置(也是该记录元素的最终位置);
3. 重复2操作,将分别对左右两个子待排记录进行快速排序,直到待排子记录个数是零或一,也就是处于有序状态。
代码:
//while 实现的快速排序
void quicksort2(int arr[], int left, int right)
{
int i=left + 1;
int j = right;
while (i<j)
{
while (i<j)
{
//找到最靠近左边大于 关键字 的位置
while (arr[i]<=arr[left]&&i<right)
{
i++;
}
//找到最靠近右边边小于 关键字 的位置
while (arr[j]>=arr[left]&&j>left)
{
j--;
}
if (i<j)
{
swap(&arr[i], &arr[j]);
}
}
swap(&arr[left], &arr[j]);//将关键字插入到合适的位置
// 如 5 1 3 7 6->3 1 5 7 6
quicksort2(arr, left, j - 1); //处理左边 3 1
quicksort2(arr, j + 1, right);//处理右边 7 6
}
}
结果: