快速排序的两种实现

217 篇文章 0 订阅
快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上C++实现代码。
(一)定轴法:

1.备份对轴(首记录)

2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且left<=right

3.移动两个指针

     *从right所指的位置向左搜索,找到第一个小于轴的元素

     *从left所指的位置向右搜索,找到第一个大于轴的元素

     *找到后如果left<right,那么就交换两个位置的值

4.重复上述过程,知道left>right

5.把轴放到right的位置,并且将right位置的值放到第一位

6.分别将right位置左边的和右边的进行上述的递归

    void quickSort(int* A,int first,int last){        //数组A,first是第一个元素下标,last是最后一个元素下标  
        if(last<=first)                           //到了长度小于1这种情况已经是有序列了  
            return;  
      
        int pivot=A[first];  
        int left=first+1;                         //left等于第二个元素  
        int right=last;      
            int temp;  
        while(left<=right){  
            while(A[right]>pivot&&right>=left) 
                right--;  
      
            while(A[left]<pivot&&left<=right)   
                left++;  
      
            if(left>=right)                    
                break;  
      
            temp=A[left];                     //交换位置  
            A[left]=A[right];  
            A[right]=temp;  
        }  
        A[first]=A[right];                        //因为right一定是停在从右到左第一个小于first的数上,交换之后,  
                                               //依然能保证first值左边的比first小,右边的比first大  
        A[right]=pivot;  
      
        quickSort(A,first,right-1);                
        quickSort(A,left,last);                     
    }  

(二)挖坑法:

1.备份轴记录

2.取两个指针low和high,初始值就是序列的两端下标,保证low<=high

3.移动两个指针

     *从high向左找到第一个小于轴的元素, 放在low的位置

     *从low向右找到第一个大于轴的元素,放在high的位置

4.重复,直到low=high,

5.把轴放在low所指的位置

6.分别对low所指的位置的左边和右边进行上述的递归

C++实现代码如下:

    void quickSort(int s[], int l, int r)  
    {  
        if(l<r)  
        {        
            int low=l;                            //左边第一个,因为第一个已经用pivot保存了  
            int high=r;                           //右边  
            int pivot = s[l];                     //第一个,已被保存  
            while(low<high)                       //当左小于右,当相等的时候会跳出循环  
            {  
                while(low<high&&s[high]>= pivot) 
                    high--;   
                if(low<high)                          
                    s[low++] = s[high];  
                          
                while(low<high&&s[low]<pivot)   
                    low++;   
                if(low<high)    
                    s[high--] = s[low];  
            }  
            s[low]=pivot;          
            quickSort(s, l, low - 1);           
            quickSort(s, low + 1, r);             
        }  
    }  



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值