快速排序算法简述

快速排序算法简述:

一、时间复杂度:

1、最优时间复杂度O(n*logn)

2、最差时间复杂度O(n2),倒序时,每个元素都需要交换

 

二、排序原理简述

    首先任意取一个标准值,随机取或者取第一个元素如(1,2,4,8,3)取第一个元素作为标准值 1,以1作为标准,将大于等于1的放在待排序列右边,将小于1的放在待排数列左边,然后待排数列就分割成了两个部分,然后对分割出来的两部分待排数组分别做相同的递归操作。

 

三、算法流程(以取第一个元素作为基准)

1、取第一个元素作为基准值,确认数列左右边界,从两边开始向扫描

int left = subLeftIndex;
       int right = subRightIndex;
       int pivot = unsortedList[subLeftIndex];

2、从右边开始往左不断扫描,直到right跟left相等或者找到一个小于标准值的元素,如果元素都大于等于标准值,那么right指针不停往左边移动

      

3、当跳出2的循环后判断是否满足条件,如果满足条件则交换左右连个指针的值,因为左边的值已经做了交换所以left需要+1,避免被覆盖

    

4、因为右边的值已经做了交换,所以从左边开始往右扫描比标准值小的元素,如果left指针对应的值均小于标准值则增加left指针的值

    

5、当跳出4的循环后,判断是否满足条件,如果满足条件,将left指针指向的值赋值给right指针对应的值,由于上一次right已经做过交换,所以不用担心右边的值丢失的问题

   

6、完成一次循环后,left跟right的值将会相等,此时待排数组已经切分成了两部分,按照索引拆分,其实还是在同一个数组

   

7、完整代码如下:

 
public class QuickSort {

    public static void quickSort(int [] unsortedList, int subLeftIndex, int subRightIndex){
        if(subLeftIndex < subRightIndex){

            int left = subLeftIndex;
            int right = subRightIndex;
            //基准
            int pivot = unsortedList[subLeftIndex];

            while(left < right){

                while(left < right && unsortedList[right] >= pivot){
                    right--;
                }
                if(left < right){
                    unsortedList[left] = unsortedList[right];
                    left ++ ;
                }
                while (left < right && unsortedList[left] < pivot){
                    left++;
                }
                if(left < right){
                    unsortedList[right] = unsortedList[left];
                    right--;
                }
            }

            //退出循环时 left = right
            unsortedList[left] = pivot;
            quickSort(unsortedList,subLeftIndex,left-1);
            quickSort(unsortedList,left+1, subRightIndex);
        }
    }

    public static void main(String[] args){
        int size = 900000000;
        int[] unsortedList = generateArray(size);
        long start = System.currentTimeMillis();
        quickSort(unsortedList,0,size -1);
        long cost = System.currentTimeMillis() - start;
        //printArray(unsortedList);
        System.out.println();
        System.out.println(" cost "+ cost + " ms");
    }

    public static int[] generateArray(int size){
        int[] array = new int[size];
        for (int i=0;i<size;i++) {
            Random r = new Random();
            int i1 = r.nextInt(size);
            array[i] = i1;
        }
        return array;
    }

    public static void printArray(int[] array){
        for (int i:array
             ) {
            System.out.print(" "+i+" ,");
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值