Java快速排序原理

1.原理

1. 先从数列中取出一个数作为基准数

2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

3. 再对左右区间重复第二步,直到各区间只有一个数

下面举例来进行说明,主要有三个参数,i为区间的开始地址,j为区间的结束地址,X为当前的开始的值

第一步,i=0,j=9,X=21

0

1

2

3

4

5

6

7

8

9

21

32

43

98

54

45

23

4

66

86

第二步,从j开始由,后向前找,找到比X小的第一个数a[7]=4,此时i=0,j=6,X=21
进行替换

0

1

2

3

4

5

6

7

8

9

4

32

43

98

54

45

23

21

66

86

第三步,由前往后找,找到比X大的第一个数a[1]=32,此时i=2,j=6,X=21

0

1

2

3

4

5

6

7

8

9

4

21

43

98

54

45

23

32

66

86

第四步,从j=6开始由,由后向前找,找到比X小的第一个数a[0]=4,此时i=2,j=0,X=21,发现j<=i,所以第一回结束

可以发现21前面的数字都比21小,后面的数字都比21大
接下来对两个子区间[0,0]和[2,9]重复上面的操作即可

下面直接给出过程,就不详细解说了

i=2,j=6,X=43

0

1

2

3

4

5

6

7

8

9

4

21

43

98

54

45

23

32

66

86

i=4,j=6,X=43

0

1

2

3

4

5

6

7

8

9

4

21

32

98

54

45

23

43

66

86

i=4,j=5,x=43

0

1

2

3

4

5

6

7

8

9

4

21

32

43

54

45

23

98

66

86

i=5,j=5,x=43

0

1

2

3

4

5

6

7

8

9

4

21

32

23

43

45

54

98

66

86

然后被分为了两个子区间[2,3]和[5,9]

…最后排序下去就是最终的答案

0

1

2

3

4

5

6

7

8

9

4

21

23

32

43

45

54

66

86

98

2.代码

package com.java.sort;

import java.util.Arrays;

/*
* 快速排序
* */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = { 21, 32, 43, 98, 65, 45, 23, 4, 66, 86};
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序后:"+Arrays.toString(arr));
        
    }

    private static void quickSort(int[] arr, int low, int high) {
        int start=low;
        int end=high;
        if (low < high) {
            // 找寻基准数据的正确索引
            // 基准数据
            int tmp = arr[low];
            while (low < high) {
                // 当队尾的元素大于等于基准数据时,向前挪动high指针
                while (low < high && arr[high] >= tmp) {
                    high--;
                }
                // 如果队尾元素小于tmp了,需要将其赋值给low,再将tmp给high,相当于交换了low和high
                arr[low] = arr[high];
                arr[high]=tmp;
                // 当队首元素小于等于tmp时,向前挪动low指针
                while (low < high && arr[low] <= tmp) {
                    low++;
                }
                // 当队首元素大于tmp时,需要将其赋值给high,再将tmp给low,相当于交换了low和high
                arr[high] = arr[low];
                arr[low]=tmp;
            }
            // 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置

            // 进行迭代对index之前和之后的数组进行相同的操作使整个数组变成有序
            quickSort(arr, start, low - 1);
            quickSort(arr, low + 1, end);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值