美文网首页
2.快速排序

2.快速排序

作者: _少年不知愁 | 来源:发表于2018-08-22 16:20 被阅读0次

1.原理
划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:

1).先从数列中取出一个数作为基准数。
2).分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3).再对左右区间重复第二步,直到各区间只有一个数

  1. 关键数为7 ,小的在左,大的在右
public class quickSort {
    public static void main(String[] args) {
        Integer[] arr = new Integer[]{100, 2, 5, 7, 8, 42};
        spitArr(arr, 0, arr.length, 7);
        System.out.println(Arrays.asList(arr));
    }


    private static void spitArr(Integer[] arr, int left, int right, int random) {

         left  = left -1;
        while (true) {
            while (left < right && arr[++left] < random) {
            }
            ;
            while (right > left && arr[--right] > random) {
            }
            ;
            if (left >= right) {
                return;
            } else {
                int tmp = arr[left];
                arr[left] = arr[right];
                arr[right] = tmp;
            }
        }
    }

    
}

3.实现快速排序
递归将数组最右边的值当做关键书,一直往下分,实现排序

public class quickSort {
    public static void main(String[] args) {
        Integer[] arr = new Integer[]{100, 3,2, 5, 7, 8,3, 42};
        //  spitArr(arr, 0, arr.length, arr[arr.length - 1]);
        sort(arr, 0, arr.length - 1);
        System.out.println(Arrays.asList(arr));
    }


    //将大于random的数据放右边,小于random的数据放左边
    private static int spitArr(Integer[] arr, int left1, int right1, int random) {

        int left = left1 - 1;
        int right = right1 - 1;
        while (true) {
            // 从左开始 取比random的大的数
            while (left < right && arr[++left] < random) {
            }
            ;
            // 从右开始 取比random的小的数
            while (right > left && arr[--right] > random) {
            }
            ;
            if (left >= right) {
                break;
            } else {
                //
                int tmp = arr[left];
                arr[left] = arr[right];
                arr[right] = tmp;
            }
        }
        Integer tmp1 = arr[left];
        arr[left] = arr[right1 - 1];
        arr[right1 - 1] = tmp1;

        return left;
    }

    private static void sort(Integer[] arr, int left, int right) {
        if (right <= left) {
            return;
        }
        Integer a = arr[right];
        int par = spitArr(arr, left, right+1, a);
        sort(arr, left, par - 1);
        sort(arr, par + 1, right);
    }

}

相关文章

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

  • [算法导论]-第七章-快速排序

    本章重点 1.快速排序 2.冒泡排序 3.希尔排序 1.快速排序 2.冒泡排序 3.希尔排序 希尔排序,也称递减增...

  • 冒泡排序与快速排序

    1.冒泡排序 2.快速排序

  • 排序方法

    1.选择排序 2.插入排序 3.冒泡排序 归并排序归并排序5.快速排序快速排序

  • 2.快速排序

    1.原理划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)...

  • 2.快速排序

    Array.prototype.quick_sort = function() { var len = this....

  • java快速学习排序---快排算法

    一、快速排序是(挖坑法)是挖坑填数 + 分治来实现。 1.快速排序的基本思想: 2.快速排序的图示: 3.快速排序的算法

  • chapter 11

    1. 内容## 讲了插入排序和快速排序以及它们的优化。 1.1 插入排序### 1.2 快速排序### 2. 习题...

  • PHP的四种基本排序整理

    1. 冒泡排序 2. 选择排序 3. 快速排序 4. 插入排序

  • Java常用算法

    1.冒泡排序 2.插入排序 3.选择排序 4.快速排序

网友评论

      本文标题:2.快速排序

      本文链接:https://www.haomeiwen.com/subject/euljiftx.html