最新快速排序算法动图演示及解析2024版(附Java代码实现),字节跳动Java内部学习资料泄露

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

4 @Override

5 public int[] sort(int[] sourceArray) throws Exception {

6 // 对 arr 进行拷贝,不改变参数内容

7 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

8

9 return quickSort(arr, 0, arr.length - 1);

10 }

11

12 private int[] quickSort(int[] arr, int left, int right) {

13 if (left < right) {

14 int partitionIndex = partition(arr, left, right);

15 quickSort(arr, left, partitionIndex - 1);

16 quickSort(arr, partitionIndex + 1, right);

17 }

18 return arr;

19 }

20

21 private int partition(int[] arr, int left, int right) {

22 // 设定基准值(pivot)

23 int pivot = left;

24 int index = pivot + 1;

25 for (int i = index; i <= right; i++) {

26 if (arr[i] < arr[pivot]) {

27 swap(arr, i, index);

28 index++;

29 }

30 }

31 swap(arr, pivot, index - 1);

32 return index - 1;

33 }

34

35 private void swap(int[] arr, int i, int j) {

36 int temp = arr[i];

37 arr[i] = arr[j];

38 arr[j] = temp;

39 }

40

41}

5、单边扫描

======

快速排序的关键之处在于切分,切分的同时要进行比较和移动,这里介绍一种叫做单边扫描的做法。

我们随意抽取一个数作为基准值,同时设定一个标记 mark 代表左边序列最右侧的下标位置,当然初始为 0 ,接下来遍历数组,如果元素大于基准值,无操作,继续遍历,如果元素小于基准值,则把 mark + 1 ,再将 mark 所在位置的元素和遍历到的元素交换位置,mark 这个位置存储的是比基准值小的数据,当遍历结束后,将基准值与 mark 所在元素交换位置即可。

代码实现:

public static void sort(int[] arr) {

sort(arr, 0, arr.length - 1);

}

private static void sort(int[] arr, int startIndex, int endIndex) {

if (endIndex <= startIndex) {

return;

}

//切分

int pivotIndex = partitionV2(arr, startIndex, endIndex);

sort(arr, startIndex, pivotIndex-1);

sort(arr, pivotIndex+1, endIndex);

}

private static int partition(int[] arr, int startIndex, int endIndex) {

int pivot = arr[startIndex];//取基准值

int mark = startIndex;//Mark初始化为起始下标

for(int i=startIndex+1; i<=endIndex; i++){

if(arr[i]<pivot){

//小于基准值 则mark+1,并交换位置。

mark ++;

int p = arr[mark];

arr[mark] = arr[i];

arr[i] = p;

}

}

//基准值与mark对应元素调换位置

arr[startIndex] = arr[mark];

arr[mark] = pivot;

return mark;

}

6、双边扫描

======

另外还有一种双边扫描的做法,看起来比较直观:我们随意抽取一个数作为基准值,然后从数组左右两边进行扫描,先从左往右找到一个大于基准值的元素,将下标指针记录下来,然后转到从右往左扫描,找到一个小于基准值的元素,交换这两个元素的位置,重复步骤,直到左右两个指针相遇,再将基准值与左侧最右边的元素交换。

我们来看一下实现代码,不同之处只有 partition 方法:

public static void sort(int[] arr) {

sort(arr, 0, arr.length - 1);

}

private static void sort(int[] arr, int startIndex, int endIndex) {

if (endIndex <= startIndex) {

return;

}

//切分

int pivotIndex = partition(arr, startIndex, endIndex);

sort(arr, startIndex, pivotIndex-1);

sort(arr, pivotIndex+1, endIndex);

}

private static int partition(int[] arr, int startIndex, int endIndex) {

int left = startIndex;

int right = endIndex;

int pivot = arr[startIndex];//取第一个元素为基准值

while (true) {

//从左往右扫描

while (arr[left] <= pivot) {

left++;

if (left == right) {

break;

}

}

//从右往左扫描

while (pivot < arr[right]) {

right–;

if (left == right) {

break;

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

还有更多Java笔记分享如下:

[外链图片转存中…(img-6deX5aa8-1715671830786)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值