zoukankan      html  css  js  c++  java
  • 数据结构-栈(应用篇)之快速排序法-C和C++的实现

    一、原理解析

    快速排序法:

    基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面。然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止。

    在以下程序案例中我们使用非递归的方式,并借助栈的数据结构实现。(关于栈的基本介绍,请看上一篇:http://www.cnblogs.com/HongYi-Liang/p/7766684.html


    二、程序解析

    C语言版本:

    源码:

    bool bAirob_QuickSort_int16(int16_t *src,int len) //int16_t
    {
        int i ;
        int j ;
        int head;
        int tail;
        MyStack stack={0};
    
        Stack_Init(&stack,2*len);
        Stack_push(&stack,len-1);
        Stack_push(&stack,0);
    
        while(Stack_size(&stack))
        {
            Stack_top(&stack,&head);
            Stack_pop(&stack);
            Stack_top(&stack,&tail);
            Stack_pop(&stack);
    
            i=head;
            j=tail;
    
            while(i<j)
            {
                 while(j>i && src[j]>=src[i])
                {
                    --j;
                }
                Swap(&src[i],&src[j]);
                    
                 while(i<j && src[i]<=src[j])
                {
                    ++i;
                }
                Swap(&src[i],&src[j]);
            }
            if(i!=tail)
            {
                Stack_push(&stack,tail);
                Stack_push(&stack,i+1);
            }
            if(i!=head )
            {
                Stack_push(&stack,i-1);
                Stack_push(&stack,head);
            }
        }
    
        Stack_Delete(&stack);
        return true;
    }
    void Swap(int16_t *a,int16_t *b)
    {
        int c=*a;
        *a=*b;
        *b=c;
    }

    结果 :

    测试程序

    #define BUFFSIZE 8
    int16_t testbuff[BUFFSIZE] = {7,1,6,2,3,5,0,4};
    int main()
    {
        int i;
        bAirob_QuickSort_int16(testbuff,BUFFSIZE);
        for(i=0;i<BUFFSIZE;i++)
        {
            printf("%d ",testbuff[i]);
        }
        printf("
    ");
    
        system("pause");
        return 1;
    }

    解析:

    1. 首先声明了一个栈结构stack用于储存还还没排序完成的段落。
    2. 先把数组头索引和尾索引压入栈中。
    3. 从栈中把取出两个数数据,第一个作为头索引,第二个作为尾索引。
    4. 以数组头索引的数据为分界把所有小于它的数放在前面,大于它的数放在后面后面。具体做法是while(i<j){}中的一段,最后i,j会重合。
    5. 如果前半部分仍能继续分组( i!=head),则把头索引和i的前一个元素索引压入栈中。如果后半部分仍能继续分组(j!=tail),则把i的下一个元素的索引和尾索引压入栈中。(压栈时先压大的索引再压小的索引)
    6. 循环上面3-5步,直到栈为空。

     用上面程序为例子

    原始数组:{7,1,6,2,3,5,0,4}

    第一次循环时,所有小于7的数放到了左边,大于7的数放到了左边。变成这样{4,1,6,2,3,5,0,7}

    第二次循环,对{4,1,6,2,3,5,0,7},对黄色部分操作,所有大于4的数在右边,小于4的数在左边{0,1,3,2,4,5,6,7}。这时候压入栈中有两组数据,4左边一组,4右边一组。

    第三次循环,对{0,1,3,2,4,5,6,7}进行操作,0作为最小的数已经在最左边了,所以数组不变。

    第四次循环,{0,1,3,2,4,5,6,7},对132操作,同上1是最小且在最左边了,所以不会改变。

    第五次循环,{0,1,3,2,4,5,6,7},对32操作,两个数调换了位置{0,1,2,3,4,5,6,7}。到这一部,4的左边已经全部处理完了,接下栈中剩下一组数据,4的右边。

    第六次循环{0,1,2,3,4,5,6,7},对56操作,然而他们本身就好了,到这里为止,排序结束。

     现在我们再看一次动图(因为动图设置没有数据“0”就用另一个“1”来代替)

     

  • 相关阅读:
    双管齐下采用压缩传输加快网页显示速度
    努力奋斗第一天
    cefSharp在XP下使得程序崩溃记录
    SVN记住用户名和密码后如何修改
    如果把编程语言比作武器
    cefSharp 设置运行时系统语言
    C# 检测机器是否有声卡设备
    C# 中判断程序是否启动使用Mutex使用异常
    chm 字体修改
    最近两年的生活
  • 原文地址:https://www.cnblogs.com/HongYi-Liang/p/7795026.html
Copyright © 2011-2022 走看看