快速排序

思想

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

代码一

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容