程序员面试宝典之数据结构基础----排序之快速排序(简单快速排序与改进快速排序)总结

快速排序是一种划分交换排序,他采用的思想是分治法。

分治法的基本思想是将原来问题分解为若干个规模很小的机构与原来问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。


①。简单快速排序算法:(a、以第一个元素为分界  b、有重复元素时效率低)

时间复杂度O(nlogn),空间复杂度O(logn)。

其实现的伪代码:

void qsort1(l, u)
       if(l >= u) return;
       m = l;
       for  i = [l+1 , u]
             if(x[i] < x[l])
                  swap(++m, i)
                  swap(l , m)
         qsort1( l, m-1)
         qsort1(m+1, u)



由于简单快速排序算法是以第一个元素为分界进行分治的,所以这仅适用于随机序列,针对这种情况,则有了改进的快速排序算法:

②。用随机函数在序列中取随机值,然后与x[l] 交换,然后同①方法进行快速排序。


由于简单快速排序对有重复元素时的效率比较低,所以针对这种情况的一种改进快速排序算法:

③。使用Partition划分算法:

代码如下:

#include <iostream>
#include <stdio.h>

using namespace std;

void improveqsort(int *list, int m, int n)
{
    int k,t,i,j;
    if(m < n)
    {
        i=m;
        j= n+1;
        k= list[m];
        while(i<j)
        {
            for(i = i+1; i<n; i++)
                if(list[i] >= k)
                    break;
            for(j = j-1; j>m; j--)
                if(list[j] <= k)
                    break;
            if(i<j)
            {
                t= list[i]; list[i] = list[j]; list[j] = t;
            }
        }
        t = list[m]; list[m] = list[j]; list[j] = t;
        improveqsort(list,m,j-1);
        improveqsort(list,i,n);
    }
}
int main()
{
    int list[10];
    int n=9, m=0, i;
    printf("Input 10 number: ");
    for(i = 0; i<10 ; i++)
        scanf("%d",&list[i]);
    printf("\n");
    improveqsort(list,m,n);
    for(i=0;i<10;i++)
        printf("%5d",list[i]);
    printf("\n");
    return 0;
}

这种双向划分的方法就避免了序列中有重复元素时效率低的问题。


注:在C中有库函数qsort,但是比上述qsort1速度要慢,因为其通用接口对每次比较都使用函数调用。

        但是C++ 库函数sort 拥有最简单的接口,非常高效,可以直接用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值