快排的c++实现(两种实现方式)

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

1.备份对轴(首记录)

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

3.移动两个指针

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

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

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


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

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

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

C++代码实现如下:

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)//找到一个比first小的,但必须保证left值小于等于right值
			right--;

		while(A[left]<pivot&&left<=right) //找到一个比first大的,但得保证left值小于等于right值
			left++;

		if(left>=right)                   //说明已经是相对有序序列,无需交换
			break;

		temp=A[left];                     //交换位置
		A[left]=A[right];
		A[right]=temp;
		left++,right--;                   //相应的进一位
	}
	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)  // 从右向左找第一个小于x的数
				high--; 
            if(low<high)                        
                s[low++] = s[high];
                    
            while(low<high&&s[low]<pivot)     // 从左向右找第一个大于等于x的数
                low++; 
            if(low<high)  
                s[high--] = s[low];
        }
        s[low]=pivot;        
        quickSort(s, l, low - 1);             //low左边递归调用
        quickSort(s, low + 1, r);             //low右边递归调用
    }
}




  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值