欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

快速排序算法简述

程序员文章站 2022-07-10 19:58:23
快速排序算法简述:一、时间复杂度:1、最优时间复杂度O(n*logn)2、最差时间复杂度O(n2),倒序时,每个元素都需要交换二、排序原理简述 首先任意取一个标准值,随机取或者取第一个元素如(1,2,4,8,3)取第一个元素作为标准值 1,以1作为标准,将大于等于1的放在待排序列右边,将小于1的放在待排数列左边,然后待排数列就分割成了两个部分,然后对分割出来的两部分待排数组分别做相同的递归操作。三、算法流程(以取第一个元素作为基准)1、取第一个元素作为基准值,确......

快速排序算法简述:

一、时间复杂度:

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+" ,");
        }
    }
}

 

 

本文地址:https://blog.csdn.net/zsf5201314z/article/details/109642264

相关标签: 数据结构和算法