排序

选择排序

冒泡排序

快速排序

同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
不同的是,冒泡排序在每一轮只把一个元素冒泡到数列的一端。而快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列的一边,比它小的元素移动到数列的另一边,从而把数列拆分成了两部分。

1.选择基准元素

(1)最简单的方法是选择数列的第一个元素
(2)随机选择一个元素作为基准元素

2.元素的移动

(1)挖坑法
(2)指针交换法

3.实现原理

(1)定义一个基准元素(数列的第一个元素)。将基准元素赋值给中间变量temp;
(2)定义3个变量leftIndex、rightIndex、index(3个变量为索引,leftIndex为数列的最左侧的索引,rightIndex为数列的最右侧的索引,index=leftIndex)。从数列两端开始比较,先将右侧的值与基准元素进行比较,如果比基准元素大,rightIndex向左移动(–),再与基准元素进行比较,如果比基准元素小,将值赋给索引为leftIndex的元素,同时leftIndex向右移动(++),index=rightIndex。再将左侧的值与基准元素进行比较,如果比基准元素小,leftIndex箱右移动(++),在与基准元素进行比较,如果比基准元素大,将值赋给索引为leftIndex的元素,同时rightIndex向左移动(–),index=leftIndex。以此类推,直到leftIndex==rightIndex时这一轮循环结束。这一轮循环确定了基准元素在数列中的位置,并且将数列分为了左右两侧
(3)分别对分开的数列进行快速排序,(利用递归,递归结束的条件为leftIndex和rightIndex相等)

4.代码

public class QuickSort {
    /*通过递归进行排序*/
    public static void sort(int[] arr, int beginIndex, int endIndex) {
        int index = partition(arr, beginIndex, endIndex);
        if (beginIndex >= endIndex) {
            return;
        }
        sort(arr, beginIndex, index - 1);
        sort(arr, index+1, endIndex);
    }

    //排序方法
    public static int partition(int[] arr, int beginIndex, int endIndex) {
        int leftIndex = beginIndex;
        int rightIndex = endIndex;
        int index = beginIndex;
        int temp = arr[beginIndex];
        while (leftIndex < rightIndex) {
            while (leftIndex < rightIndex) {
                if (arr[rightIndex] < temp) {
                    arr[leftIndex] = arr[rightIndex];
                    leftIndex++;
                    index = rightIndex;
                    break;
                }
                rightIndex--;
            }
            while (leftIndex < rightIndex) {
                if (arr[leftIndex] >= temp) {
                    arr[rightIndex] = arr[leftIndex];
                    rightIndex--;
                    index = leftIndex;
                    break;
                }
                leftIndex++;
            }
        }
        arr[index] = temp;
        return index;
    }
    //测试方法
    public static void main(String[] args) {
        int[] arr={ 49, 38, 65, 97, 23, 22, 76, 1, 5, 8, 2, 0, -1, 22 };
        sort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }
}
//最后的结果为:[-1, 0, 1, 2, 5, 8, 22, 22, 23, 38, 49, 65, 76, 97]

源码中的排序

  • 长度>= 286 采用归并排序
  • 47<=长度<286 采用快速排序
  • 长度 <47 插入排序
  • 特别的:byte数组长度大于29、short或char数组长度大于3200 ==> 计数排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值