快速排序的原理听起来很简单,就是随意在需要排序的数组中选择一个数,然后把数组里比这个数小的放在它的左边,比它大的放在右边。
上面的解释是错误的,不是放在这个数的左边或者右边,而是对于这个数组来说的左边和右边。当然疑问就是,左和右的边界怎么确定。
但程序写起来就不那么容易了(因为我太菜)。
这个函数实现如下(出自《剑指offer 》):
int Partition(int data[], int,length,int start,int end)
{
if(nums.size() <= 0 || start < 0 || end >= length )
return;
int index = RandomRange(start,end); // 随机选择一个值
Swap(&data[index], &data[end]); // 将选定的值放在组=数组最后面
int small = start -1;
for(index = start; index < end; ++index) // 开始循环(解释一下循环里的东西)
{
if(data[index] < data[end]) // 顺序将数组里每一个数和最后一个(也就是选定的数)比较,如果比它小的
{
++small; // 就交换到数组前面,一直放就行。
if(small != index)
{
Swap(&data[index],&data[small]);
}
}
}
++small; // 最后,将选定的那个数放在比它小的值的之后的一个位置上。
Swap(&data[small], &data[end]);
return samll; // 返回分块的位置。
}
接下来就是对数组进行递归排序,递归的终止条件是start == end;
void QuickSort(int data[], int length,int start, int end)
{
if(start == end) return;
int index = Partition(data,length,start,end);
if(index > start)
QuickSort(data,length,start,index-1);
if(index < end)
QuickSort(data,length,index+1,end);
}
我写这个博客是为了解决leetcode上的颜色分类问题。
然而…
效率也太低了吧。
以下代码是执行时间为4ms的,用的不是快速排序。我也不知道叫什么排序。就是是2的话就放在最后面,0的话就放在最前面…快是快,但不具有普遍性。
class Solution {
public:
void sortColors(vector& nums) {
int begin = 0, end = nums.size() - 1;
int i = 0;
while (i <= end) {
if (nums[i] == 0) {
swap(nums[i], nums[begin]);
begin++;
i++;
} else if (nums[i] == 2) {
swap(nums[i], nums[end]);
end–;
} else i++;
}
}
};