zoukankan      html  css  js  c++  java
  • 快速排序(快排)

    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    算法处理过程(截图参考 坐在马桶上看算法:快速排序):

    代码:

    public class QuickSort {
    
        public static void sort(int[] arr, int low, int high){
            int l = low;
            int h = high;
            int tmp = 0;
            if (l <= h){//扫描低位标小于高位标
                tmp = arr[l];
                while (l != h){//从两边交替扫描,直到l=h
                    while (h>l && arr[h]>tmp) h--;
                    //从右往左扫描,找到第一个比基准数据小的数,进行替换
                    arr[l] = arr[h];
                    while (l<h && arr[l]<tmp) l++;
                    //从左往右扫描,找到第一个比基准数据大的数,进行替换
                    arr[h] = arr[l];
                }
                arr[h] = tmp;
                sort( arr, low, l-1 );  //对基准元素左边的数据进行排序
                sort( arr, h+1, high ); //对基准元素右边的数据进行排序
            }
        }
    
        public static void main(String[] args){
            int[] arr = {10, 2, 1, 7, 12, 23, 32, 4, 6, 98};
            sort( arr, 0, arr.length-1 );
            for (int i : arr){
                System.out.println(i);
            }
        }
    
    }

    时间复杂度:基准数据选择为最大或者最小值时,时间复杂度为O(n^2),若选择的基准数据为中间数时,时间复杂度为O(nlog2n)

    空间复杂度:O(log2n)

    稳定性:非稳定排序

    快排应用

    把一个0-1串(只包含0和1的串)进行排序,你可以交换任意两个位置,问最少交换的次数?

    采用快排,左边的0和右边的1都可以不用管,只计算需要交换的数据次数即可。

    伪代码:

    000...10100..1111

    int count = 0;

    for(int i=0,j=len-1; i<j; ++i,--j){

      for(; (i<j)&&(a[i]==0); ++i);

      for(; (i<j)&&(a[j]==1); --j);

      if(i<j) ++count;

    }

  • 相关阅读:
    2018面试题
    输入对象和数量制造批量假数据
    前端监控和前端埋点方案设计--摘抄
    给页面上所有的a标签增加随机数每次点击保证最新
    给所有ajax请求增加随机数
    打印2018年的日历
    为图片添加文字 canvas
    地图搜索地图定位标注
    地图拖拽定位
    智能搜索地图
  • 原文地址:https://www.cnblogs.com/yhzhou/p/9230655.html
Copyright © 2011-2022 走看看