前言
接下来我们来学习算法中的快速排序算法,快速排序算法不同于冒泡排序等基本算法,这是一种快捷,运行时间很短的一种快速对数组元素进行排序的算法。
一、认识快速排序
快速排序法,是给以一个数组,然后对里面的元素进行排序,速度很快,比冒泡排序等一些简单的排序方法,更为快速,与归并排序差不多。
二、使用步骤
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的下标
代码如下(示例):
1. quick_sort(int q[], int l, int r) { 2. if (l >= r) { 3. return; 4. 5. } //如果l大于r的话,不用比较了 ,直接返回就可以了 说明没有排序完成或者是一开始传入数值l r就有问题 6. int x = q[l]; //x的取值可以为数组中的任意一个元素,但是要知道的是 如果用的l下表对应的元素 后面的递归操作r应该传参为 j 而不是用i 7. //防止发生死循环 相应的如果是用 q【r】 那么传参的时候r不能用j 只能用i 8. int i = l - 1; 9. int j = r + 1; //取的是数组第一个元素的左边的地址,数组最后一个元素的右边的地址,这样进入下面循环就可以直接用do,while进行比较 10. while (i < j) { 11. do { 12. i++; 13. } while (q[i] < x); 14. do { 15. j--; 16. } while (q[j] > x); 17. if (i < j) { 18. int tmp = q[i]; 19. q[i] = q[j]; 20. q[j] = tmp; //当i 和 j都停止的时候 进行交换 下标对应的元素 21. } 22. } 23. quick_sort(q, l, j);//左右遍历 这个时候 i=j且为指向x的下标(因为x为数组中的元素,所以经过上面的循环,i和j指向x了) 24. quick_sort(q, j + 1, r); 25. } 26. 27. int main() 28. { 29. int n = 0; 30. int arr[10000] = {0}; 31. scanf("%d", &n); 32. for (int i = 0; i < n; i++) { 33. scanf("%d", &arr[i]); 34. } 35. quick_sort(arr, 0, n - 1); 36. for (int i = 0; i < n; i++) { 37. printf("%d ", arr[i]); 38. } 39. return 0; 40. } 41.
2.测试
检验是否排序成功
对于 i 和 j 最后的位置进行测定 看看是否和 x的下标相同
由此可知,实际上就是如此,得到的 i=j 且为指向x的下标
总结
这一期对于快排的认识就到此为止, 下一期,我们来讲解归并排序的算法内容。