一、基本原理
选择第一个数作为基准数,通过一趟遍历将比他小的数放在他左边,比他大的数放在他的右边。
- 选择第一个数做为基准数p;
- 从数列最后一个开始遍历,找出第一个比基准数小的数,索引为j,从数列第二个开始遍历,找出第一个比基准数大的数,索引为i;交换a[i]和a[j]的值;
- 重复上面步骤直到i >= j,将a[i]和基准数交换位置,这样基准数就调整到数列中间;
- 对“基准数左侧数列”和"基准数右侧数列"执行以上操作。
二、算法分析
以数组{6, 3, 8, 2, 9, 1}为例:
第一轮left = 0, right = 5,i = left+1, j = right,基准数p=6
- j=5:比较1和6,1<6,结束遍历j,取j=5;
- i=1:比较3和6,3<6,继续遍历i;
- i=2:比较8和6,8>6, 结束遍历i,取i=2;
- 调整a[i]和a[j]的值,数组为:6,3,1,2,9,8
- j=4:比较9和6,9>6,继续遍历j;
- j=3:比较2和6,2<6,结束遍历j,取j=3;
-由于不满足i<j,退出本轮遍历;
交换a[0]和a[i=3]的值,数组为:2,3,1,6,9,8
第二轮left = 0, right = 2,i = left+1, j = right,基准数p=2
- j=2:比较1和2,1<2,结束遍历j,取j=2;
- j=1:比较3和2,3>2,结束遍历i,取i=1;
- 调整a[i]和a[j]的值,数组为:2,1,3,6,9,8
- j=1:比较1和2,1<2,结束遍历j,取j=1;
- 由于不满i<j,退出本轮遍历
交换a[0]和a[i=1]的值