快速排序算法

活动地址:CSDN21天学习挑战赛

目录

一、快速排序算法描述

二、快速排序的一次划分

三、划分部分伪代码

四、递归执行快速排序伪代码

五、实例

六、快速排序时间性能分析

七、小结

一、快速排序算法描述

  在待排序列选择一个轴值(基准),通过一趟排序将待排序列记录分割成独立的两部分,前一部分的关键码均小于或者等于轴值,后一部分的关键码均大于或者等于轴值,然后分别对这两部分重复上述操作,直至整个序列有序。

二、快速排序的一次划分

    变量i,j初始化i=first(第一个元素的下标),j=end(最后一个元素的下标);

    首先,j从后向前开始扫描,直到a[j]>a[i],将a[j]和a[i]的位置交换,使关键码小的记录移动到前面去;然后,i从前向后扫描,直到a[i]>a[j],将a[i]和a[j]的位置交换,使关键码大的记录移动到后面去;重复上述过程,直到i=j。

三、划分部分的伪代码

      int partition(int a[],int first,int end){

         while(i<j){

          while(i<j&&a[i]<=a[j])

                    j--;

           if(i<j){//因为a[i]>a[j],交换a[i]和a[j],并调整i

           交换a[i]和a[j]的位置;

            i++;}

          while(i<j&&a[i]<=a[j])

             i++;

         if(i<j){//因为a[i]>a[j],交换a[i]和a[j],并调整j

          交换a[i]和a[j]的位置;

           j--;}

          return i;//返回轴值}

 四、递归执行快速排序伪代码

      void quickSort(int a[],int first,int end){//对分割得到的两个子序列递归地执行快速排序

      while(first<end){//循环结束的判断标志

       pos=partition(a,first,end);

       quickSort(a,first,pos-1);

       quickSort(a,pos+1,end);} }

五、实例

   输入一组数,使用快速排序算法使这组数据从小到大有序排列

   输入:43 23 56 12 68 90 6 8

   输出:6 8 12 23 43 56 68 90

 代码:

 

 运行结果:

六、 快速排序时间性能分析

  最好情况:每次划分对一个记录定位后,该记录的左侧部分和右侧部分长度相同;

                    时间复杂度O(n*log2n)

  最差情况:每次划分只得到一个比上一次划分少一个记录的子序列(另一个子序列为空);

                    时间复杂度O(n^2)

  平均情况:时间复杂度O(n*log2n)

七、小结

     快速排序不适合待排序列基本有序的情况,在长度较短时,通常选用冒泡排序、直接插入排序、简单选择排序等排序方法合适。

     

                 

           

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值