• 数据结构C语言实现----快速排序


     快速排序算法

    下文中提到的“指针”并不是C语言语法上的指针!

    下文中提到的“指针”并不是C语言语法上的指针!

    下文中提到的“指针”并不是C语言语法上的指针!

      首先看下面这个例子:

      

       我们取第一个元素为基准元素:

      

       之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一个

      空白的值上,不用担心值被覆盖)

      4的值比5小,所以左右指针的值交换,右指针就变成空的了:

      

       一旦完成交换操作,另一个指针就要开始移动了!

      (交换完成后,左指针要立刻右移一下,因为接下来判断左指针是否右移的条件是元素与基准的比较,交换完成后左指针指向的元素交换前已经比较过了)

      左指针开始右移,指向的元素与基准元素比较,比基准小左指针继续右移,比基准元素大,就与右指针交换

      4比5小,左指针右移:

      

       9比5大,与右指针交换:

      

      一旦完成交换操作,另一个指针就要开始移动了!

      (交换完成后,右指针要立刻左移一下,因为接下来判断右指针是否左移的条件是元素与基准的比较,交换完成后右指针指向的元素交换前已经比较过了)

      右指针开始左移,第一个元素小于基准

      左右指针的值交换:

      

       交换完成左指针应该立刻右移一位:

      

       左指针开始右移

      第一个元素0,小于基准,继续右移

      下一个元素4也小于基准,继续右移

      来到元素7,大于基准,指针的值交换:

      

       交换完成后,右指针立刻左移一位:

      

       元素8大于基准,所以右指针继续左移:

      

       元素4小于基准,交换值:

      

       交换完成,左指针立刻右移一下:

      

       此时左右指针重合,重合位置放入基准元素:

      

       让后基准元素左面都比他小,右面都比他大,左右两个子列再套用上述方法,直至排序结束!

      

    通过分析上面的例子,我们知道,快速排序大体分这么几步:

        while(左指针在右指针的左边)

        {

            while(右指针指向的元素大于基准)

            {

              右指针右移

            }

            //退出了上面这个循环说右指针移动到了一个小于基准的元素下面

            将右指针指向的值赋值给左指针指向的值

            左指针立刻右移一下

            while(左指针指向的元素小于基准元素)

            {

              左指针右移一位

            }

            //退出了上面这个循环说明左指针移动到了一个大于基准的元素下面

            将左指针指向的值赋值给右指针指向的值

            右指针立刻左移一下

        }

        最后左右指针会重合,重合的位置赋值为基准元素的值;

        左子列重复快速排序;

        右子列重复快速排序;

    运行结果:

      

    源码如下:

     #include<stdio.h>
     typedef int keytype;
     //快速排序
     void quicksort(keytype k[] , int ArrayLeft , int ArrayRight)
     {
         int left = ArrayLeft;
         int right = ArrayRight;
         int temp = k[left];
    
        if (left < right)
        {
            while (left < right)
            {
                while (left < right && k[right] >= temp)
                {
                    right--;
                }
                //if (k[right] < temp)
                {
                    k[left] = k[right];
                    left++;
                }
                
                while(left < right && k[left] <= temp)
                {
                    left++;
                }
                //if (k[left] > temp)
                {
                    k[right] = k[left];
                    right--;
                }
            }
            k[left] = temp;
            quicksort(k,ArrayLeft,left-1);
            quicksort(k,right+1,ArrayRight);
        }
     }
     #define MAX 100
    int main()
    {
        //读取一串数字
        printf("请输入一串无序数字:");
        int c;
        int n = 1;
        keytype k[MAX];
        while ((c = getchar())!='
    ')
        {
            k[n++] = c-'0';
        }
        if (c == '
    ')
        {
            k[n] = '';
        }
        //快速排序
        quicksort(k,1,n-1);
        printf("这串数字从小到大为:");
        for (size_t i = 1; i <= n-1; i++)
        {
            printf("%d",k[i]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Hadoop杂记
    hadoop主节点(NameNode)备份策略以及恢复方法
    (转)第12章 Shell脚本编程
    Hadoop添加删除节点
    secondarynamenode异常
    (转)Memcached笔记——(一)安装&常规错误&监控
    浅(kou)谈(hu)杜教筛
    Pollard_Rho 算法
    Miller_Rabin 素数判定算法
    zoj分类(包括poj已做的)
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/13425936.html
Copyright © 2020-2023  润新知