前言:
快速排序工作原理就是先在序列中找到一个基准值,我称为K值。然后小于K的放在K的前面,大于K的放在K的后面。其实我们每操作K一次,就相当于把序列分为两个部分,一部分大于K,一部分小于K,就这样周而复始。我们可以推测出平均的时间复杂度为lgn,为啥这样说呢。但是书本上说的为nlgn,其实他是每次都进行了一次最优值筛选,但是我没有这样做。我是直接选择中间位置的值当做K值。
好了下面是代码,待会儿再对代码进行说明:
void fastSort(int *p, int start, int end)
{
// 1.选择第一个数字为K值
// 2.比K大的在右边,比K小的在左边
// 3.继续上面步骤
int i = start;
int j = end;
int tmp = 0;
int k = p[(start + end) / 2];
int kPos = (start + end) / 2;
if (i == j)
return; //可以不计算了
while (i != j)
{
//left
while (i<kPos)
{
if (p[i] > k)
{
tmp = p[i];
p[i] = k;
p[kPos] = tmp;
kPos = i;
}
else
{
i++;
}
}
while (j > kPos)
{
if (p[j] < k)
{
tmp = p[j];
p[j] = k;
p[kPos] = tmp;
kPos = j;
}
else
{
j--;
}
}
}
//left
fastSort(p, 0, (kPos - 1 >= 0) ? ( kPos - 1 ) : 0 );
//right
fastSort(p, (kPos + 1 <= end ) ? (kPos + 1) : end, end);
}
void fastSort(int *p, int start, int end):
*p:需要排序的数列指针
start:序列开始位置
end:序列结束位置
while (i<kPos)
{
if (p[i] > k)
{
tmp = p[i];
p[i] = k;
p[kPos] = tmp;
kPos = i;
}
else
{
i++;
}
}
这部分作用是交换p[i]和k。交换之后,现在kPos已经等于i,所以while(i<kPos)已经过不去了。所以到下面环节:
while (j > kPos)
{
if (p[j] < k)
{
tmp = p[j];
p[j] = k;
p[kPos] = tmp;
kPos = j;
}
else
{
j--;
}
}
现在又进行另外部分交换,交换之后j--,同时kPos和j相同,所以循环不能进行。就这样,交换一次进行另外一次交换。
就这样多次循环之后,直到i==j之后。本次总循环完成。可以进行左边右边排序。