目录
前言
接下来我们来学习算法中的快速排序算法,快速排序算法不同于冒泡排序等基本算法,这是一种快捷,运行时间很短的一种快速对数组元素进行排序的算法。
一、认识快速排序
快速排序法,是给以一个数组,然后对里面的元素进行排序,速度很快,比冒泡排序等一些简单的排序方法,更为快速,与归并排序差不多。
二、使用步骤
1.原理
1)第一步是找数组中随意的一个元素值,设定为x
2)设定两个指针分别为 i j 指向数组左侧 、右侧 ,这里我们设定为
i=l-1 j=r+1 这是因为 我们想要第一步进去这个循环的时候就让 l 和 r下标对应元素与x进行比较,i先向右移动 i++ 直到遇到大于等于x的元素 ,停止循环,再让 j 向左移动,j--;直到遇到小于等于x的元素,j停止 交换 i 和 j 对应下标的元素
3)然后对x左侧的元素进行递归处理,对x右侧的元素进行递归处理,其实也就是 i 或者 j 这个时候i 和 j 是相等的 都是指向x的下标
代码如下(示例):
quick_sort(int q[], int l, int r) {
if (l >= r) {
return;
} //如果l大于r的话,不用比较了 ,直接返回就可以了 说明没有排序完成或者是一开始传入数值l r就有问题
int x = q[l]; //x的取值可以为数组中的任意一个元素,但是要知道的是 如果用的l下表对应的元素 后面的递归操作r应该传参为 j 而不是用i
//防止发生死循环 相应的如果是用 q【r】 那么传参的时候r不能用j 只能用i
int i = l - 1;
int j = r + 1; //取的是数组第一个元素的左边的地址,数组最后一个元素的右边的地址,这样进入下面循环就可以直接用do,while进行比较
while (i < j) {
do {
i++;
} while (q[i] < x);
do {
j--;
} while (q[j] > x);
if (i < j) {
int tmp = q[i];
q[i] = q[j];
q[j] = tmp; //当i 和 j都停止的时候 进行交换 下标对应的元素
}
}
quick_sort(q, l, j);//左右遍历 这个时候 i=j且为指向x的下标(因为x为数组中的元素,所以经过上面的循环,i和j指向x了)
quick_sort(q, j + 1, r);
}
int main()
{
int n = 0;
int arr[10000] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
2.测试
检验是否排序成功
对于 i 和 j 最后的位置进行测定 看看是否和 x的下标相同
由此可知,实际上就是如此,得到的 i=j 且为指向x的下标
总结
这一期对于快排的认识就到此为止, 下一期,我们来讲解归并排序的算法内容。