快速排序算法
思想:二分法,分治法,递归
排序实例
6 1 2 7 9 3 4 5 10 8
6为基准,也就是temp
先从右找第一个比基准数小的,再从左找第一个比基准数大的,进行交换,这里必须从右边先找的原因是因为基准数定的是最左的数。
如果选取最左边的数a[left]作为基准数,那么先从右边开始可保证i,j在相遇时,相遇数是小于基准数的,交换之后temp所在位置的左边都小于temp。但先从左边开始,相遇数是大于基准数的,无法满足temp左边的数都小于它
找到7 和 5
6 1 2 7 9 3 4 5 10 8
交换后得到
6 1 2 5 9 3 4 7 10 8
依次类推,当得到 i == j 或 i > j时,排序无法继续进行,此时情况如下
6 1 2 5 4 3 9 7 10 8
此时交换基准数与3
3 1 2 5 4 6 9 7 10 8
这样就保证了基准数6左边都比他小,右边都比他大
这时,再将3设为基准数,在3 1 2 5 4 中进行快速排序,在9 7 10 8中进行快速排序
也就是进行递归排序算法,最终就得到排序结果
1 2 3 4 5 6 7 8 9 10
#include <iostream>
using namespace std;
void QuickSort(int* a, int left, int right)
{
int i = left;
int j = right;
int temp = a[left];
int t = 0;
if (left >= right)
return;
while (i != j)
{
while (i < j && a[j] >= temp)//a[j]<temp跳出循环,找到第一个a[j]<temp
j--;//从右向左找第一个小于x的数
while (i < j && a[i] <= temp)//a[i]>temp跳出循环,找到第一个a[i]>temp
i++;//从左向右找第一个大于x的数
//交换两个数在数组中的位置
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//将基准数归位
a[left] = a[i];
a[i] = temp;
QuickSort(a, left, i - 1);
QuickSort(a, i + 1, right);
return;
}
int main()
{
int n;
int a[101] = {0};
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
QuickSort(a, 0, n-1);
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
return 0;
}
测试用例:
Input:
11
3 4 5 1 34 61 22 41 111 2 87Output:
1 2 3 4 5 22 34 41 61 87 111