美文网首页
快速排序

快速排序

作者: lpworkstudy | 来源:发表于2017-09-15 23:26 被阅读0次

    思想

    确定主元素,利用主元素进行数组划分,小于主元素的元素在主元素左边,大于主元素的在右边,利用递归排序。这里用到了分治思想

    代码一

    int partition(int a[], int p, int q)
    {
        int pivot = a[p];
        int i = p;
        int j = i + 1;
        int temp;
        while (j <= q)
        {
            if(pivot > a[j])
            {
                temp = a[i+1];
                a[i+1] = a[j];
                a[j] = temp;
                i++;
    
            }
    
            j++;
        }
        temp = a[i];
        a[i] = a[p];
        a[p] = temp;
    
        return i;
    
    }
    
    void Quick_sort(int a[],int p,int q)
    {
        if (p < q)
            {
                int i = partition(a,p,q);
                Quick_sort(a,p,i-1);
                Quick_sort(a,i+1,q);
    
                }
    
    }
    
    int main(void)
    {
        int a[] = {2,3,1,7,6,5,0};
        int p = 0;
        int q = sizeof(a) / sizeof(int) - 1;
        Quick_sort(a,p,q);
            int i;
        for(i=0;i<=q;i++)
            printf("%d ",a[i]);
        printf("\n");
        return 0;
    
    }
    

    代码二

    //平均时间复杂度 O(NlogN)
    
    #include<stdio.h>
    
    int partition(int *a, int L, int R)
    {
        int i = L;
        int j = R;
        int x = a[L];
        while(i < j)
        {
            //从右往左找出比x小的元素
            while (i < j && a[j] > x)
                j--;
            if (i < j)
                a[i++] = a[j];
            //从左往右找出比x大的元素
            while ( i < j && a[i] < x)
                i++;
            if(i < j)
                a[j--] = a[i];
        }
    
        //将主元素插入
        a[i] = x;
        return i;
    }
    
    void Quick_sort(int * a,int L, int R)
    {
        if (L < R)
        {
        int p = partition(a,L,R);
        Quick_sort(a ,L,p - 1);
        Quick_sort(a,p + 1,R);
        }
    }
    
    int main(void)
    {
        int a[] = {4,4,4,4,4,4,4};
        int L = 0;
        int R = sizeof(a) / sizeof(int) - 1;
        Quick_sort(a,L,R);
        int i;
        for(i = 0;i <= R; i++)
            printf("%d ",a[i]);
        printf("\n");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:快速排序

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