快排
快排的思想:分治
分治:将一个大问题划分为小的部分,接着一个个去解决
步骤
1.取分界点 :选最左边的为分界点(按个人习惯)。
2.调整区间:分界点的左边小于分界点值,右边的大于。
3:递归处理左右两端
下面是一组试数: 3 5 2 7 6
规定:起初选最左边为分界点。 i 指向最左边 ,j指向最右边。
首先 :1. i 先移动 。i在3的位置, 3不小于3 i 停下来。 j移动,一直移动到2的位置停下来。
2然后 i此处的位置 与 j此处的位置交换。
3. 重复1 2 的步骤。 直到 i = j ,初步排序停下来
4.开始分治:用递归
左组:2就一个数字可以不用管了,对于本题
右组: 5 3 7 6 继续执行 1. 2 . 3 .4的步骤
上面是大致的思想,但是快排里面有个小细节问题:边界问题。针对于这个问题解决的最好方法是背模板(下面我会展示一个比较简单理解的模板),当然如果你的大脑转的很快,当我没说。
具体代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void quick_sort(int q[], int L, int R)
{
int x = q[L], i= L - 1, j = R + 1;
if (L== R) return;
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
//必须要在i<j时才能交换
//if不能放在while循环的外面的 试数 1 3 7 6 5 8 如果选6为X if放在外面会出现死循环 i永远小于j
if(i<j)swap(q[i], q[j]);
}
//进行分区处理
quick_sort(q,L,j);
quick_sort(q, j+1, R);//这里不能用i,试数 2 1,这里会一直是quick_sort(q,0,1),死循环;
}
int main(void)
{
int t = 0;//数字个数
int n = 0;//要写入的数
scanf("%d", &t);
int q[1000];
for (int k = 0; k < t; ++k)
{
scanf("%d", &n);
q[k] = n;
}
quick_sort(q,0,t-1);
for (int k = 0; k < t; ++k)
{
printf("%d\n",q[k]);
}
}