算法系列-快速排序

   今天重温一下快速排序,快速排序主要是通过从右向左和从左向右扫描,当左边的扫描标记到比基准值大的停下,右边的扫描标记标记到比基准值小的停下,然后交换左右标记处的值,每一轮当左右扫描标记相遇则本轮结束,每一轮扫描主要是把基准值放到正确的位置上,把比基准值小的放到基准值的左边,比基准值大的放到右边。

    直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public void quickSort(int[] data,int left,int right)
{
    if(left >right)
    {
       //直接退出
        return ;
    }
     
    int baseValue=data[left];
    int start=left;
    int end=right;
    int tmp=0;
    while(start!=end)
    {
        //从右向左扫描
        while(data[end]>=baseValue&&end>start)
        {
           end--;
        }
        //从左向右扫描
        while(data[start]<=baseValue&&end>start)
        {
           start++;
        }
         
        //交换两个值得位置
        if(end>start)
        {
           tmp=data[end];
           data[end]=data[start];
           data[start]=tmp;
        }
    }
     
    //一轮遍历完成后,交换基准值
    data[left]=data[start];
    data[start]=baseValue;
     
    //递归继续下一轮遍历
    quickSort(data,left,start-1);
    quickSort(data,start+1,right);
}

  上面的代码主要通过递归来实现该排序,如果我们把这两段代码交换一下位置,效果是否是一样的呢?

 

 

  这段代码是我不经意间写反的,答案是肯定的,这两段代码的顺序不能交换,交换后就无法排出正确的顺序。为什么会有这样的差异呢,其实很简单,如果先从左向右扫描,就无法保证基准值的左边是小于它的,右边是大于它的,如下图遍历过程就未找到正确的基准值,这违背了算法定义,所以必须先从右向左扫描。

 

 

 

posted @   人不疯狂枉一生  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示