• 排序算法---快速排序


    基于交换的排序、不稳定的排序

    对冒泡排序的改进

    通过一趟排序,将待排关键字分为两部分,其中一部分的全部关键字都小于另一部分的全部关键字,然后分别对这两部分进行快速排序,可以选取第一个关键字为基准,将比它小的放在它之前,将比它大的放在它之后,完成这一趟之后,基准所在的位置就将初始序列分成两部分(一部分大、一部分小)

    (1)选取序列的第一个关键字为基准base,附设两个指针low、high分别指向关键字序列的第一和最后一个元素

    (2)从high位置往前,找到第一个小于base的数,交换

    (3)从low位置往后,找到第一个大于base的数,交换

    (4)重复(2)(3)直到low==high,完成了第一趟排序,将待排序列分成两部分

    (5)分别对这两部分进行快速排序(递归 )

        public static void quickSort(int[] array,int i,int j){
            //i和j记录本次快速排序的区间,由于下一次快速排序的区间需在本次区间的基础上确定,因此,i和j的值需要被记录
            int low = i;
            int high = j;
            int base = array[low];
            if(low<high){
                while(low<high){
                    while(low<high && array[high]>=base){
                        high--;
                    }
                    if(low<high){
                        int temp = array[high];
                        array[high] = array[low];
                        array[low] = temp;
                    }
                    while(low<high && array[low]<base){
                        low++;
                    }
                    if(low<high){
                        int temp = array[high];
                        array[high] = array[low];
                        array[low] = temp;
                    }
                        
                }
                listArray(array, i, j);
            }else{
                return;
            }
    
            quickSort(array, i, low-1);
            quickSort(array, high+1, j);
        }

    注:其实交换是没有必要的,因为基准base最终在low==high那个位置上

        public static void quickSort(int[] array,int i,int j){
            //i和j记录本次快速排序的区间,由于下一次快速排序的区间需在本次区间的基础上确定,因此,i和j的值需要被记录
            int low = i;
            int high = j;
            int base = array[low];
            if(low<high){
                while(low<high){
                    while(low<high && array[high]>=base){
                        high--;
                    }
                    if(low<high){
                        array[low] = array[high];
                    }
                    while(low<high && array[low]<base){
                        low++;
                    }
                    if(low<high){
                        array[high] = array[low];
                    }
                        
                }
                array[low] = base;
                listArray(array, i, j);
            }else{
                return;
            }
    
            quickSort(array, i, low-1);
            quickSort(array, high+1, j);
        }

    时间复杂度

    最好平均O(nlogn) 最坏O(n^2)

  • 相关阅读:
    jquery validate常用方法及注意问题
    jQuery Validate
    $('div','li') 和 $('div , li') 和 $('div li') 区别
    HTML中Div、span、label标签的区别
    Java中访问修饰符public、private、protecte、default
    shiro过滤器过滤属性含义
    (转载)常用Git命令清单
    Git-简明指南
    菜鸟程序员怎么才能提高自己的技术--(献给自己共勉)
    Visiual Studio CLR20r3问题
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9553063.html
Copyright © 2020-2023  润新知