• 数据结构之快速排序


    首先快速排序:就是选择一个基数,然后从两端依次进行比较,若右边大于基数,则不进行交换,直到右边的数据小于基数,然后冲左边开始和基数比较,若左边的小于基数,则进行下一个比较,直到左边的数据大于基数才进行比较。循环的跳出条件是左边的数组号大于或者等于右边的数组号。

    实例数组是:23  34 56 78 65 90 88 92 18 21
    首先以23作为基数,则进行比较时,从右边开始,21和23比较,21小于23,所以,把21放到23的位置。结果为21  34 56 78 65 90 88 92 18 【】。
    然后从左边开始和基数23比较,21小于23,向右移一位,low位+1,用34和23比较,发现34大于23,则把34放到上次移动后的位置【】,
    这次交换后的排序结果是: 21  【】 56 78 65 90 88 92 18 34,
    接着继续从右边开始比较,34大于23,向左移一位,high减一,使用18和23比较,18小于23,把18放到上次34移走后的位置,结果为: 21  18 56 78 65 90 88 92 【】 34,
    接着再从左边开始进行比较,18小于23,56大于23,所以把56移位到上次18移走后的位置【】处,结果为:21  18 【】 78 65 90 88 92 56 34,
    接着再从右边开始比较,发现56,92,88,90,65,78都比23大,比较完后没有需要移动的,且从左边开始比较的坐标和冲右边开始比较的坐标一样,两边碰面了,则这次比较就结束了,
    最终把基数放到最后【】处的位置即可。
    比较一次结束,可以唯一确定一个数据的最终位置,比如这次排序后,基数23的位置以确定了的,其他的数据属于待排状态,以基数为分界线,把基数两边的数据按照统一的规则进行排序,直到排序出最终结果位置。

    快速排序的Java实现代码如下所示:

    package com.class02;
    
    /**
     * 快速排序:
     * @Date: 2019/3/23 9:55
     * @Version: 1.0
     */
    public class QucikSortTest {
        static int a[] = {23,34,56,78,65,90,88,92,18,21};
    
        public static void Sort(int a[],int low,int high){
            int stand=0;
            if(low<0||high<0||low>high||low>=a.length)return;
            stand=getMid(a,low,high);
            if(low<high){
                Sort(a,stand+1,high);
                Sort(a,low,stand-1);
            }
        }
    
        public static int getMid(int a[],int low,int high){
            int stand=a[low];
            while(low<high){
                while(low<high&&a[high]>=stand)high--;
                a[low]=a[high];
                while(low<high&&a[low]<=stand)low++;
                a[high]=a[low];
            }
            a[low]=stand;
            show(a);
            return low;
        }
    
        public static void show(int a[]){
            for(int i=0;i<a.length;i++){
                System.out.print("  "+a[i]);
            }
            System.out.println();
        }
    
        public static  void main(String []args){
            System.out.println("排序前的数据序列为:");
            QucikSortTest.show(a);
            System.out.println("-----------------------------------------");
            QucikSortTest.Sort(QucikSortTest.a,0,9);
            System.out.println();
            System.out.println("排序后的数据序列为:");
            QucikSortTest.show(a);
        }
    }

    程序的运行结果如下所示:

  • 相关阅读:
    WEB前端工程师 – 职业生涯规划
    求Sn=a+aa+aaa+…+aaa…a的值
    输入一行字符,分别统计出其中英文字母 空格 数字和其他字符的个数
    getchar()的用法!
    求1+2+…+n的和不大于1000的最大自然数n
    编程打印输出*金字塔
    从键盘输入一个整数,判断该数是否回文数.
    编程求"水仙花数"
    编程求出1000以内的完全数
    输入两个正整数,求它们的最大公约数和最小公倍数.
  • 原文地址:https://www.cnblogs.com/guopengxia0719/p/10582998.html
Copyright © 2020-2023  润新知