快排的c++实现(两种实现方式)
快排的c++实现(两种实现方式)
https://blog.csdn.net/jeryjeryjery/article/details/52894756
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jeryjeryjery/article/details/52894756
快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上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右边递归调用
- }
- }
- 上一篇 LCA问题的RMQ解法解析
- 下一篇 oracle中表空间详解

浙公网安备 33010602011771号