快速排序的实现(c++版 输出交换次数 copy次数)

快速排序

实验要求:使用快速排序,输出排序好的序列以及copy的次数、比较的次数

实验说明:因为没有用到swap对数组进行交换,仅仅是对将数字copy到坑位中,所以是copy版本的快速排序。

快速排序的思路

一个数字一个坑位,假设一个有5位数字的数组__34512__,那就是5个坑位。设定第一个数为比较的基准值,所以数组中所有的数字都跟3比较,比3大的就去后面的坑位,比3小的就去前面的坑位。

  1. 一前一后两个指针,设为a和b,一个指向第一个数字,一个指向最后一个数字。
IMG_3820EDAD8D87-1
  1. 先让指针b移动,如果b指向的数字小于基值,那就将b指向的数字放进a指向的坑里:

    这里2<3,所以将2放入第一个坑里;

IMG_412BF512B09C-1
  1. 把2放进坑里后,将指针a往后移动一步,指向4:
IMG_2E871E414830-1
  1. 将指针a指向的数字与基值进行比较,4>3所以放到b所指向的坑位:
IMG_3B498492AE18-1
  1. 把4放进坑位后,将指针b往前移动一步,指向1:
IMG_D546FE76D0A3-1
  1. 继续步骤2,让指针b指向的1与基值比较,1<3,所以将1放入a在的坑位中:
IMG_73BE4CE5EA11-1
  1. 将指针a往后移动一位,让它指向5:

    IMG_00A3FA4612C5-1
  2. 将指针a所指数字与基值比较,5>3,所以将5放到b所在的坑位中:

    IMG_C906CA4D685F-1
  3. 将指针b向前移动一位,发现与指针a相遇,将基值3放入ab所指向的坑位中:

    image-20201216170439334
  4. 此时,基值3前面的数都比3小,3后面的数都比3大,第一轮排序完成。接着我们再通过递归排序3左边的数和3右边的数,直到全都要排序的数组只有一位时结束排序。

快排的代码步骤

先找到无序序列中的一个数作为基准点(这里设第一个值为基准点),再设立两个指针,第一个i从前往后移动,第二个指针j从后往前移动:

void quick_sort(int s[],int begin,int end)//begin为第一个数的下标,end为最后一个数的下标
{
   
    int i=begin,j=end;
    int x=s[i];//基准点
    }		

先由j从后往前移动,找比基准值小的数:

当找到比基准值小的数后,将比基准值小的数填充到第i个位置,copy值+1

//从后向前找比x小的数
        while (i<j && s[j]>=x) {
   
            j--;
            comp++;
        }
        //找到比x小的数之后
        if (i<j) {
   
            s[i]=s
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值