小白懂算法之快速排序

2021-03-17 06:24

阅读:693

标签:思路   实现   介绍   概念   ++   rgba   stat   temp   deb   

一.快速排序介绍

  快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。

二.算法原理

  快速排序的算法原理:在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准数(与其他记录比较的数),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将基准数放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。

三.实现代码(Java实现)

    public static void FastSort(int[] arr,int i,int j) {
        /**
         *     实现思路:
         *         在数组随便选择一个作为基准数,默认是数组第一个
         *         需要两个伪指针指向在数组两边的元素并向内逐一与基准数比较
         *         左边指针 为 left 专门查找比基准数大的数,右边指针 right 专门查找比基准数小的数
         *         若left>right则逻辑不成立
         *         在满足leftright时就不再查找了,将基准数归位,即放到一个分界点位置,左边数小于基准数,右边大于基准数
         *         递归调用本函数,重新设定指针left,right的所指的位置
         * 
         *         下面注释所说的指针只是方便解释!
         */
        if(i>j) return;
        
        int left = i;    //left为左指针
        int right = j;    //right为右指针
        int temp = arr[i];    //临时保存基准数
        
        while(left //满足left 

            while(arr[right] >= temp && left //当右指针所指的数比基准数大且left 
                right--;
            }
            
            while(arr[left] //当左指针所指的数比基准数小时且left 
                left++;
            }
            
            if(left //当左边位置
                int t = arr[left];
                arr[left] = arr[right];
                arr[right] = t;
            }
            
        }
        
        //将基准数归位到分界点,这里的分界点位置以left或者right都行。
        arr[i] = arr[left];
        arr[left] = temp;
        
        FastSort(arr,i,left-1);    //基准数两边递归调用
        FastSort(arr,left+1,j);
        
    }

  强调:

    1.在上面代码的情况,实际上不可能会出现left > right的情况,都是在left = right的时候,不满足left

    2.记住如果基准数在数组的左边,那么必须从right先开始,因为从right先开始就能保证right右测的数一定是大于基准数的,到时候left和right处在同一个位置时,此位置的右边一定是比基准数大的;具体原因还是因为受left

  main方法测试:

    public static void main(String[] args) {
        //创建一个无序数组
        int[] arr = new int[] {2,3,1,4,5,7,6,8,10,9};
        //调用快速排序方法,返回一个排序后的方法
        FastSort(arr,0,arr.length-1);
        
        //遍历数组
        System.out.print("最终结果:");
        for(int i=0;i) {
            System.out.print(arr[i]+" ");
        }
        
    }

  OK,如果有任何疑问可在下面留言!

小白懂算法之快速排序

标签:思路   实现   介绍   概念   ++   rgba   stat   temp   deb   

原文地址:https://www.cnblogs.com/ibcdwx/p/13976792.html


评论


亲,登录后才可以留言!