快速排序

作者: 简言之_ | 来源:发表于2019-02-18 12:44 被阅读6次
    1.jpg
    2.jpg
    快速排序的思想:(分治法)
    1 先从数组中选取一个数作为基准点,可随机选择;
    2 将数组中大于该基准点的放在该基准点右边,小于该基准点的放在该基准点左边;
    3 对左右两个数组进行快速排序。
    
    图片.png

    快速排序的流程:


    图片.png 图片.png
    整个算法处理过程: 图片.png

    算法动态演示:


    1.gif
    图片.png

    代码如下:

    #include <stdio.h>
    
    void swap(int a[], int low, int high) //交换两个数的值
    {
        int t = a[low];
        a[low] = a[high];
        a[high] = t;
    }
    
    int partition(int a[], int low, int high)  //计算基准点,分割为左右两个数组
    {
        int point = a[low];//基准点等于第一个元素
    /*    while(1){
            while(low<high && a[++low]<point);
            while(a[--high]>point);
            if(low>=high) break;
    */
          while(low<high)
          {
              while(low<high && a[high]>=point)//控制high指针比较并左移
              {
                     high--;
              }  
             swap(a,low,high);
                  //}
             while(low<high && a[low]<=point)//控制low指针比较并右移
              {
                    low++;
              }  
              swap(a,low,high);
          }
        return low;//返回基准点位置
    }
    
    void quicksort(int a[], int low, int high)  //low:起始位置 high:末尾位置
    {
        if(low<high){
            int point = partition(a,low,high);//计算基准点
            quicksort(a,low,point-1);  //对基准点的左边进行排序
            quicksort(a,point+1,high);//对基准点的右边进行排序
        }
    }
        
    int main()
    {
        int i;
        int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
        int N = 12;
        
        quicksort(a, 0, N-1);
        
        for(i=0; i<N; i++) printf("%d ", a[i]);
        printf("\n");
        
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:快速排序

        本文链接:https://www.haomeiwen.com/subject/xutaeqtx.html