快速排序
思路
快速排序是在未排序数组中找一个基准(最左边的数),将所有比基准数小的数放在基准数左边,大的数放在基准数右边。最后在基准数左边用同样的方法,右边用同样的方法直到为顺序集合
算法流程:
递归参数:左,右边界
终止条件:左边界大于右边界
单次过程:
- 以左边界为基准点
- 以左边界为左指针起始点,右边界为右指针起始点
- 先移动右指针,直到找到比基准点小或者遇到左指针停止
- 移动左指针,直到找到比基准点大或者遇到右指针停止
- 如果左右指针未相遇,则交换左右指针的两个数
- 以此类推直到左右指针相遇
- 交换基准点和此时的左右指针所指的值,完成局部排序
代码
#include <iostream>
using namespace std;
int a[101],n;//待排序数
void quickSort(int left,int right);
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
quickSort(1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
void quickSort(int left,int right) {
//递归结束条件为可排序块为0
if(left > right) {
return;
}
//temp为选定基准
int temp = a[left];
int i = left;
int j = right;
int t;
while(i!=j) {
//移动右指针,直到找到比基准小
while(i<j && a[j]>=temp) {
j--;
}
//移动左指针,直到找到比基准大
while(i<j && a[i]<=temp) {
i++;
}
//两指针未相遇时交换
if(i<j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//将最终相遇点与基准交换
a[left] = a[i];
a[i] = temp;
//继续往左块和右块排序,直到最终为顺序集合
quickSort(left,i-1);
quickSort(i+1,right);
}
另一种解法的模板
void quick_sort(int q[],int l,int r){
if(l >= r) return;
int t = q[(l+r)/2],i = l - 1,j = r + 1;
while(i < j){
do i ++; while(q[i] < t);
do j --; while(q[j] > t);
if(i < j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j + 1,r);
}