栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

快速排序(java实现及过程解析)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速排序(java实现及过程解析)

1.概念

        快速排序是由冒泡排序改进而得的,基本思想是在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入适当的位置后,数据序列被此元素划分为两个部分。所有关键字比该元素关键字小的元素放在前一部分,所有比他大的元素放置在后一部分,并把该元素排在这两个部分的中间(称为该元素归位),这个过程成为一趟快速排序,即一趟划分。

        之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或者空为止。

2.java实现
import java.util.Arrays;

public class QuickSort {
    public void quickSort(int nums[], int left, int right) {
        //如果左边>=右边,没有意义
        if (left >= right) {
            return;
        }
        //快速排序一次后,基准元素所在的位置
        int position = partition(nums, left, right);

        //此时基准元素左侧的元素都比他小,右侧的都比他大
        //对基准元素左、右两侧的元素再进行快速排序
        quickSort(nums, left, position - 1);
        quickSort(nums, position + 1, right);
    }

    public int partition(int nums[], int left, int right) {
        //总是以最左边的元素作为基准元素
        int target = nums[left];
        int l = left + 1;
        int r = right;
        while (l <= r) {
            if (nums[l] > target && nums[r] < target) {
                swap(nums, l++, r--);
            }
            if (nums[l] <= target) {
                l++;
            }
            if (nums[r] >= target) {
                r--;
            }
        }
        //把基准元素放在对应的位置
        if(left != r){
            swap(nums, left, r);
        }
        //返回基准元素所在的位置
        return r;
    }

    
    public void swap(int nums[], int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
 3.过程

        待排序数组:

        [6, 8, 7, 9, 0, 6, 1, 3, 2, 4, 5]

基准lr
第1次划分
原数组进入partition
012345678910
68790613245
交换5和8,l++,r--
012345678910
65790613248
交换4和7,l++,r--
012345678910
65490613278
交换2和9,l++,r--
012345678910
65420613978
l++
012345678910
65420613978
l++
012345678910
65420613978
l++
012345678910
65420613978
l++
012345678910
65420613978
l>r,结束while
交换target和nums[r]
012345678910
35420616978
第2次划分
进入partition
012345678910
35420616978
交换5和1,l++,r--
012345678910
31420656978
r--
012345678910
31420656978
交换4和0,l++,r--
012345678910
31024656978
l++
012345678910
31024656978
l>r,结束while
交换target和nums[r]
012345678910
21034656978
第3次划分
进入partition
012345678910
21034656978
l++
012345678910
21034656978
l++
012345678910
21034656978
l>r,结束while
交换target和nums[r]
012345678910
01234656978
第4次划分
进入partition
012345678910
01234656978
r--,l>r,结束while
r=left,不做交换
012345678910
01234656978
第5次划分
进入partition
012345678910
01234656978
r--
012345678910
01234656978
r--,l>r,结束while
r=left,不做交换
012345678910
01234656978
第6次划分
进入partition
012345678910
01234656978
l++
012345678910
01234656978
l>r,结束while
交换target和nums[r]
012345678910
01234566978
第7次划分
进入partition
012345678910
01234566978
l++
012345678910
01234566978
l++ 
012345678910
01234566978 
l>r,结束while
交换target和nums[r]
012345678910
01234566879
第8次划分
进入partition
012345678910
01234566879
l++
012345678910
01234566879
l>r,结束while
交换target和nums[r]
012345678910
01234566789
最终结果
01234566789

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/332078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号