排序之快速排序算法
来源:互联网 发布:免费办公用品软件系统 编辑:程序博客网 时间:2024/06/06 04:05
快排是在实际中最常用的一种排序算法,速度快,效率高。所以在开发的过程中,经常使用到;在面试的时候,也会经常考到。
快排的思想是分治思想。例子是最好的老师,我们就在实际的例子中理解快排吧。
首先定义一个数组{6, 2, 5, 3, 8, 1,10,12,4,7},对它进行排序.
- 先从数列中取出一个数作为基准数(key),我们就先第一个数吧,就6.
- 首先设置两个游标,left = 0,right =9(即把两个游标指向数组的两头)。
- 再把array[right]和key作比较,发现array[right]>key,right- -.
- 然后继续比较array[right]和key,发现4<6,此时就更换array[right]和array[left]的值.再left++.[4,2,5,3,8,1,10,12,6,7]。right = 8,left = 1;
- 再次比较array[left]和key的值,2<6,不变,left++;right = 8,left = 2;
- 再次比较array[left]和key的值,5<6,left++;right = 8,left = 3.
- 再次比较array[left]和key的值,3<6,left++;right = 8,left = 4.
- 此时比较array[left]和key的值,8>6,交换array[right]和array[left]的值。[4,2,5,3,6,1,10,12,8,7],right- -;right = 7,left = 4.
- 重复上面的步骤,直到right = left.此时[4,2,5,3,1,6,10,12,8,7],right = left = 5.现在在array[5]左边的数都比array[5]小,array[5]右边的数都比array[5]大,这就完成了第一次循环。
- 对array[5]左边的和右边的数组分别重复上述步骤。直到排序完成。
快排的思想是选择一个数作为基准(key),遍历数组,把比这个key大的放到key右边,比key小的放到key左边。然后再对key值左边和右边的数组分别再次进行排序,直到排序完成。
它的时间复杂度:O(nlgn).
下面是java代码:
public class Main { static int[] sortedArray = {6, 2, 5, 3, 8, 1}; public static void main(String[] args) { sort(sortedArray, 0, sortedArray.length - 1); for (int i = 0; i < sortedArray.length; i++) System.out.print(sortedArray[i] + ","); } private static void sort(int[] array, int left, int right) { //当左边cursor大于或者等于右边的cursor时,说明左右游标已经碰头了,此时应该结束此次循环排序。 if (left >= right) return; int key = array[left]; int leftCursor = left; int rightCursor = right; while (leftCursor < rightCursor) { //先从右边的cursor往左边移动,直到当找到比key小的数的时候或者当左右游标碰头的时候结束循环 while (leftCursor < rightCursor && array[rightCursor] > key) { rightCursor--; } //此时找到了比key小的数(或者leftCursor == rightCursor,这种情况下面执行了也没有影响) //所以把右游标的数移动到左游标那里(当第一次循环里,左游标的数此时和key一样) array[leftCursor] = array[rightCursor]; //从左开始循环,原理和上面从右循环差不多,不同的就是此时找的是比key大的数 while (leftCursor < rightCursor && array[leftCursor] < key) { leftCursor++; } array[rightCursor] = array[leftCursor]; } //当运行到这里的时候,说明left=right,此时左右游标碰头,碰头后,把key还原 array[leftCursor] = key; //这一次循环排序完成了,此时leftCursor = rightCursor,游标把数组分成了两部分, //在array的左边,数字全比key小,右边的数字比key大,然后再对key左右的数字分别再次进行排序(递归) sort(array, left, leftCursor - 1); sort(array, leftCursor + 1, right); }}
0 0
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法 之 快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- POJ 1703
- Daemon线程和Join线程
- 批处理 选项语法
- PhotoView ImageView缩放
- XSS攻击及防御
- 排序之快速排序算法
- 【PA2014Final】【BZOJ3726】Wykladzina
- yii2 随笔(七)依赖注入——(2)php依赖注入的简单实现
- tomcat虚拟目录设置
- Photoshop“替换颜色”实现局部换色
- iOS学习之路(三)--界面篇
- android install soft
- PHP数据结构之——链表
- 【算法】快速排序