zoukankan      html  css  js  c++  java
  • JAVA快速排序代码实现

    原文链接:https://www.cnblogs.com/anthonyhoo/p/12259543.html

    通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    快速排序原理【转载】:

    第一步:设置两个指针left和right分别指向数组的头部和尾部,并且以头部的元素(6)为基准数

    第二步:right指针先往左移动,找到小于基准数的元素就停下,然后移动left指针

    第三步:left指针往右移动,找到大于基准数的元素就停下,然后交换right和left指针所值元素的值

    重复第二、三步,直到两个指针left和right重合

    第四步:两个指针重合后将基准数(6)与两个指针指向的元素值(3)交换

       到这时,第一轮排序结束,此时以基准数(6)为分界点,(6)左边的数都小于等于6,(6)右边的数都大于等于6,现在我们已经将原来的序列以(6)为分界点拆成了两个序列左边的序列是3 1 2 5 4,右边的序列是9 7 10 8,接下来分别处理这两个序列,原理相同。

      最终序列为1 2 3 4 5 6 7 8 9 10,到此排序完全结束(快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止)

    注:为什么是right先移动,不能是left先移动?

      假设需要排列的数组为[ 0 ,  1 ],如果先移动左边指针。此时左指针会移动到1的位置,因此右指针(原本就在1的位置)位置不变。此时将基准书与指针指向的数字进行交换,结果就变成了[ 1 ,  0 ],而实际情况我们需要的是左边比基准数小,右边比基准数大,所以产生的结果就完全相反了。

      下面附上实现代码:

    复制代码
    package algorithmimplementation;
    public class QuickSort {
        public static void main(String[] args) {
            int[] num = new int[]{6,1,2,7,9,3,4,5,10,8};
            for(int a:quickSort(num, 0, num.length-1)) {
                System.out.print(a+" ");
            }
        }
        public static int[] quickSort(int[] num, int leftPos, int rightPos) {        
            if(rightPos < leftPos)
                return num;
            else {
            //将数列最左边第一个数字作为基准数
            int initLeftPos = leftPos;
            int initRightPos = rightPos;
            int baseNum = num[leftPos];
                    
            while(rightPos > leftPos) {
                //第二步:右边指针找到小于基准数的就停下
                while(num[rightPos] >= baseNum & rightPos > leftPos) {
                    rightPos--;
                }
                
                //第二步:左边指针找到大于基准数的就停下
                while(num[leftPos] <= baseNum & rightPos > leftPos) {
                    leftPos++;
                }
                
                //交换两个指针最终标记的数字
                if(rightPos > leftPos)
                    swap(num,leftPos,rightPos);
            }
            
            //当左右两边指针重合时,将基准数与指针指向数字交换
            swap(num,leftPos,initLeftPos);
            
            //指针左半边递归,以进来的数组的左边为界,右边是左右指针相同时左边一个
            quickSort(num, initLeftPos, leftPos-1);
            
            //右边同理
            quickSort(num, rightPos+1, initRightPos);
    
            return num;
            }
        }
        
        //swap方法:将数组中leftPos和rightPos上的两个数值进行交换
        public static void swap(int[] num,int leftPos,int rightPos) {
            int temp = num[leftPos];
            num[leftPos] = num[rightPos];
            num[rightPos] = temp;
        }
    }
    复制代码
  • 相关阅读:
    标签和过滤器
    【android】简单的布局和控件&简单的练习作品
    【android】配置模拟器以及第一个“Hello World!”
    【android】sdk安装及环境变量配置、android studio的安装及新建项目
    【javaweb】库存物资管理系统思路与总结
    【java】关于异常处理的思考
    【作业】对于对象的课程作业
    【作业】神奇的代码,包装类Integre,100==100,129!=129
    【作业】随机数+参数可变的方法+实验任务(输出素数+使用递归,判断是否为回文+统计一篇英语问斩单词出现频率)
    【作业】三个关于java的探索和两个实验题
  • 原文地址:https://www.cnblogs.com/eryun/p/13037363.html
Copyright © 2011-2022 走看看