快速排序思想 : 分治思想
① 确定分界点x
② 调整区间 使得区间左边的数都小于x 区间右边的数都大于x
③ 递归处理左右两区间
例题:
给定你一个长度为 n 的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式:
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。
输出格式:
输出共一行,包含 n个整数,表示排好序的数列。
#include <iostream>
using namespace std ;
const int N =1e6 + 10 ;
int n ;
int q[N] ;
void quick_sort(int q[],int l ,int r )
{
// l r 都是指针下标
// 边界问题 如果左边是数大于右边就说明区间是一个空区间或者是只有一个数
if(l>=r) return;
// 设我们的边界为最中间的那个数 ,当然也可以设置成最右边q[r] 或者是设置在最左边 q[l]
// 定义两个指针i j 分别指向最左边界减一(l-1) 和最右边界加一(r+1) 因为我门的思想是i先向右移动(j先向左移动)l-1保证移动一次正好i指向最左边第一个元素
int x=q[(l+r)/2],i=l-1 ,j=r+1;
while(i<j)
{
// 当左指针指向的值小于我们设定的值的时候就指针右移
// 当右指针指向的值小于我们设定的值的时候就指针左移
// 直到两个指针相遇
do i++; while(q[i]<x);
do j--; while(q[j]>x);
// 前两个do 都执行过了 但是这时候i<j 的时候 就交换 两个指针指向的数 swap(a,b) 将a b 进行交换
if(i<j) swap(q[i],q[j]);
}
// 第二步后我们得到的左区间都小于x 右区间都大于x
// 思想的第第三步 递归处理左区间段
quick_sort(q,l,j);
// 思想的第第三步 递归处理右区间段
quick_sort(q,j+1,r);
}
int main()
{
scanf("%d",&n);
for(int i = 0;i<n;i++) scanf("%d",&q[i]);
quick_sort(q,0,n - 1);
for(int i=0;i<n;i++) printf("%d ",q[i]) ;
return 0;
}
本篇博客是在学习闫总的算法基础课后总结所得,与大家分享,希望对大家有些许帮助!!!