• 快速排序(快排)


    快速排序由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;

    }

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/yhzhou/p/9230655.html
Copyright © 2020-2023  润新知