一天一算法(1):快速排序

前言

我去网上查看了快速排序的代码,千篇一律,代码简直一个模子里面印出来的,这样没意思,用的都是别人的思路。于是我自己动手写了一个,虽然代码不够简洁,但是我觉得排序的目的应该达到了

思路

快速排序算法无非就是利用左右两个指针,向左或者向右遍历数组,并且与基准点比较,从而达到排序的目的
首先:
假设我们的无序数列是: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);
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值