• java基础算法之快速排序


      快速排序(Quicksort)是对冒泡排序的一种改进。在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识。fighting

    算法概念

      快速排序由C. A. R. Hoare在1962(50多年了呢)年提出,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列(摘自百度百科)。

      快速排序采用了一种分治的策略,所以有时候我们也称为分治算法。

    算法思想

      1.先从数列中取出一个数作为基准数,一般会取第一个数做为基准数。

      2.然后对数列进行分区,首先将比这个基准数大的数全放到它的右边,小于或等于基准数的数全放到它的左边(一刀切,左边小于基准数,右边大于基准数)。

      3.再对划分的左右区间重复第二步,直到各区间只剩一个数就完成了排序。

      下面画一个详细的大图,只画了第一趟排序的过程,知道第一躺怎么排序,后面都是一样的。

    算法代码

    package com.roc.Quicksort;
    
    /**
     * 快速排序
     * 
     * @author liaowp
     * 
     */
    public class Quicksort {
        static void sort(int value[], int left, int right) {
            if (left < right) {// 判断左边的下标是小于右
                int i = left, j = right;// i为小值,j为大值
                int temp = value[left];// 默认中间数为temp,即最左边的数
                while (i < j) {// 如果i<j
                    while (i < j && value[j] >= temp) {// 从右往左比较,如果i<j且value[j]>=temp
                        j--;
                    }
                    if (i < j) {// 如果i<j,找到有比中间数大的
                        value[i] = value[j];// 左边的数放右边的数
                        i++;// 左移一位
                    }
                    while (i < j && value[i] < temp) {// 从左往右找
                        i++;
                    }
                    if (i < j) {// 找到有比中间数小的,替换到右边
                        value[j] = value[i];
                        j--;
                    }
                }
                value[i] = temp;
                for (int n = 0; n < value.length; n++) {
                    System.out.print(value[n] + " ");
                }
                System.out.println();
                sort(value, left, i - 1);// 左边的重复
                sort(value, i + 1, right);// 右边的重复
            }
        }
    
        public static void main(String[] args) {
            int value[] = { 5, 1, 8, 4, 15 };
            System.out.print("原始数据:");
            for (int i = 0; i < value.length; i++) {
                System.out.print(value[i] + " ");
            }
            System.out.println();
            sort(value, 0, 4);
            System.out.print("排序结果:");
            for (int i = 0; i < value.length; i++) {
                System.out.print(value[i] + " ");
            }
        }
    
    }

    代码结果如下:

    原始数据:5 1 8 4 15 
    4 1 5 8 15 
    1 4 5 8 15 
    1 4 5 8 15 
    排序结果:1 4 5 8 15 

    注意:第一遍快速排序不会直接得到最终结果,只会把比基准数大和比基准数小的数分到基准数的两边。为了得到最后结果,需要再次对基准数两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。

  • 相关阅读:
    编译 出错
    关于工程思维
    关于大屏拼接方案 触摸屏 红外 和 电容屏
    爱宝A-1180热转印条码打印机 打印乱码,对不齐的问题
    制作 企业微场景 邀请函
    《七年就是一辈子》 逻辑思维 互联网 得到
    Python妙用re.sub分析正则表达式匹配过程
    第11.25节 Python正则表达式编译re.compile及正则对象使用
    Python正则表达式书写容易碰到的陷阱:W*和W*?匹配过程遇到的问题
    Python正则表达式W+和W*匹配过程的深入分析
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/6011282.html
Copyright © 2020-2023  润新知