快速排序

快速排序是利用递归来实现的一种排序算法,每执行一次确定一个基准值并返回。
需要传入 指向数组第一个元素 和 最后一个元素的指针作为参数。

分别设为low 和 high。

下面我们模拟一下计算机如何执行:(默认升序)


50, 36, 66, 76, 36, 12, 25, 95 为例
当进入函数时选取第一个值为基准值(也就是50)
先和high指向的元素比较(95)

  1. 50 <= 95 , high向前移。指向 25.
  2. 50 >= 25,将25填充到50的位置。
  3. 然后和指向low的值比较,
  4. 刚刚25已经移到第一个位置(也就是low指向的位置)
  5. 50 >= 25, low向后移,指向36.
  6. 50 >= 36,low向后移,指向66.
  7. 50 <= 66,将66填充到 high指向的位置
  8. 然后再和high指向的值比较,
  9. 50 <= 66,high 向前移,指向12
  10. 50 >= 12, 将12填充到low指向的位置
  11. 然后和low指向的值比较
  12. 最后low和high指向同一个位置,这个位置也就是基准值应该在的位置。

总结一下:
1.选取基准值
2.先和high指向元素比较,小于,high–,大于*(a+low) = *(a+high);
3.再和low指向元素比较,大于,low++,小于*(a+high) = *(a+low);
4.最后low和high指向同一个位置, 返回指向这个位置的值。

下面附上简单示例,

#include<iostream>
#include <ctime>
int partion(int low,int high, int *a)
{
  
          int X = *(a + low); //选取基准值
          if(a == NULL) return 0;
  
           while(low != high)
           {
                while(low != high && X <= *(a + high))
                {
                   high--;								//先和high指向的值比较
                }
                *(a+low) = *(a+high);  
                
                while(low != high && X >= *(a + low))  //再和low指向的值比较
                {
                    low++;
                }
                *(a + high) = *(a+low); 
            }
	//退出循环时,low和high相等
            *(a + low) = X;
  
        return low;   //返回基准值所在位置
 
}
void qsort(int low, int high, int *a)
{
        int temp = partion(low,high,a);


        if(low != temp)         
        {
             qsort(low,temp-1,a); //将上面分好的左边一半传入函数
         }
         if(high != temp)
        {
                 qsort(temp+1, high,a);
        }
}
int main()
{
 
         int *a = (int*)malloc(sizeof(int)*100000);
         for(int i = 0; i < 100000; i++)
         {
             a[i] = 100000 - i;
         }
         
clock_t timeStart = clock();  //设置时间初值
         qsort(0,99999,a);
         cout <<" qsort time : " << clock() - timeStart; //打印出这个排序所需时间
         cout << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值