快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上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右边递归调用
}
}