partition函数是快速排序的基础,在看剑指offer里的partition代码时,有些卡,这里注解一下。
int Partition(int data[], int length, int start, int end)
{
//无效输入控制
if(data == nullptr || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameters");
//随机选取一个下标,将对应元素作为基准
int index = RandomInRange(start, end);
//交换基准元素与最后一个元素,即将基准元素放在最后
Swap(&data[index], &data[end]);
//定义small,主要用于记录小于small的下标的对应元素均小于基准元素
int small = start - 1;
//for循环遍历整个数组 由于基准元素已经放在最后,所以index没有用了,这里作为遍历数组的下标
for(index = start; index < end; ++ index)
{
//如果小于基准元素
if(data[index] < data[end])
{
//small+1,出现一个小于基准元素的则small加一个
++ small;
//防止small和index对应元素相同还交换,
if(small != index)
//如果两者不相同则需要则交换,也就是小的元素跳到前面
Swap(&data[index], &data[small]);
}
}
//<=small的元素都比基准元素小了,那么我们的再将small+1,然后在将基准元素调过来。
++ small;
//基准元素调到small+1的位置
Swap(&data[small], &data[end]);
//返回基准元素下标
return small;
}
假如数据为 data=“1,6,4,2,5"; start=0, end =4, 随机的index为2,那么运行过程为
index | 0 | 1 | 2 | 3 | 4(跳出) | ||
small | 0 | 0 | 0 | 1 | 2 | ||
data | 1,6,5,2,4 | 1,6,5,2,4 | 1,6,5,2,4 | 1,2,5,6,4(交换6和2) | 1,2,4,6,5(交换5和4) |