码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2018-12-31 13:03:19      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:最小值   扫描   它的   int   比较   log   amp   quick   实现   

快速排序是冒泡排序的改进版,主要思想:
1.在待排序的元素内任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的;

举例说明:待排序数组 int[] {5 7 1 8 4}
1.把5作为与其它元素比较的基准元素,设两个指针right与left;
2.right指针从右向左扫描,首先4和5比较,4<5,拆4,补原元素5的空缺位,left指针右移;
3.7和5比较,7>5,拆7补原元素4的空缺位,right指针左移;
4.8和5比较,8>5,保持不变,right指针继续左移;
5.1和5比较,1<5,拆1补原元素7的空缺位,left指针右移,此时left=right,则将基准元素5补入到right/left的位置,结束这一趟拆补工程,往下继续递归。

代码实现:
public class Test {

    public static void main(String[] args) {
        
        int[] arr = {6, 3, 8, 2, 9, 1};
        System.out.println("排序前数组为:");
        for(int i : arr) {
            System.out.print(i + ", ");
        }
        System.out.println();
        
        quickSort(arr, 0, arr.length-1);
        
        System.out.println("排序后数组为:");
        for(int i : arr) {
            System.out.print(i + ", ");
        }
        
    }
    
    public static void quickSort(int[] arr, int _left, int _right) {
        int left = _left;
        int right = _right;
        int tmp = 0;
        if(left <= right) { //待排序的元素至少有两个的情况
            tmp = arr[left]; //待排序的第一个元素作为基准元素
            while(left != right) { //从左右两边交替扫描,直到left = right
                while(right > left && arr[right] >= tmp) {
                    right--; //从右往左扫描,找到第一个比基准元素小的元素
                }
                arr[left] = arr[right]; //找到后与arr[left]交换
                while(right > left && arr[left] <= tmp) {
                    left++; //从左往右扫描,找到第一个比基准元素大的元素
                }
                arr[right] = arr[left]; //找到后与arr[right]交换
            }
            arr[right] = tmp; //基准元素归位
            quickSort(arr, _left, left-1); //对基准元素左边的元素进行递归排序
            quickSort(arr, right+1, _right); //对基准元素右边的元素进行递归排序
        }
        
    }

}

当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏情况,时间复杂度为O(n^2);
当分区选取的基准元素为待排序元素中的“中值”,为最好情况,时间复杂度为O(nlog2^n),平均也按此计算;
快速排序的空间复杂度为O(log2^n);
快速排序为一种不稳定的排序。

快速排序

标签:最小值   扫描   它的   int   比较   log   amp   quick   实现   

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10201781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!