前言
我去网上查看了快速排序的代码,千篇一律,代码简直一个模子里面印出来的,这样没意思,用的都是别人的思路。于是我自己动手写了一个,虽然代码不够简洁,但是我觉得排序的目的应该达到了
思路
快速排序算法无非就是利用左右两个指针,向左或者向右遍历数组,并且与基准点比较,从而达到排序的目的
首先:
假设我们的无序数列是:5,11,1,2,8,6,9
然后声明两个int变量i和j,然后我们让 i 和 j 分别指向数组的两端,第一次遍历的话,i=0,j=6,基准点为5。
之后我再声明一个int类型的变量step,当step=0时,代表由右向左遍历数组,当step=1时,代表从左向右遍历数组。
第一轮遍历
开始:
i=0 , j=6,step=0,基准点为5
第一次寻找:
j=6,所以 j 指向9,step=0,所以由右向左遍历,因为9>5,所以我们让 j–,直到找到小于5的数,当 j=3的时候,指向的2小于5,则让2替代以 i 为索引的数,然后将step置为1,这时无序数组为:2,11,1,2,8,6,9 ,各个参数为 i=0 , j=3 ,step=1
第二次寻找:
由于step=1,所以由左向右遍历,我们让 i++,直到找到第一个比5大的数,所以在 i=1的时候,找到11比5大,则让 11 替代以 j 为索引的数,之后将step置为0,这时无序数组为:2,11,1,11,8,6,9 ,各个参数为 i=1 , j=3 ,step=0
第三次寻找:
step=0,所以由右向左遍历,让 j–,直到找到小于5的数,当j=2的时候,找到1 小于5,所以让 1 替代以 i 为索引的数,之后将step置为1,这时无序数组为:2,1,1,11,8,6,9 ,各个参数为 i=1 , j=2 ,step=1
第四次寻找:
由于 i=1 , j=2 所以没有遍历的必要了,我们将5直接替代 以 j 为索引的数,所以无序数组为:2,1,5,11,8,6,9
这时我们发现,5左边都是比他小的数,右边都是比他大的数。
最后:
我们利用递归,对5左边和右边的数执行快速排序就行了。
代码
public static void FastSort(long[] a, int front, int low)
{
if (front > low)
return;
int left = front;
int right = low;
long k = a[left];//设置基准点
int step = 0;
while (front <low)
{
switch (step)
{
case 0:
if (a[low] < k)
{
a[front] = a[low];
step = 1;
}
else
{
low--;
}
break;
case 1:
if (a[front] >= k)
{
a[low] = a[front];
step = 0;
}
else
{
front++;
}
break;
}
}
a[front] = k;
if (low<left)
return;
FastSort(a,left, low - 1);
if (front >=right)
return;
FastSort(a, front+1,right);
}