排序-交换排序

交换排序

以交换位置的方式排序
冒泡排序
把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置…
我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。
除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成。
在这里插入图片描述

    public int[] MySort (int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n-i-1; j++) {
                if (arr[j+1]<arr[j]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        return arr;
    }

快速排序
从数列中取出一个值,将比这个值大的放在它的右边,将比这个值小的放在它的左边,再最左右两个区域重复这个过程,直到各个区域只有一个数。

具体步骤

  • 附设两个指针 left 和 right,它们初始分别指向待排序序列的左端和右端;此外还要附设一个基准元素 pivot(一般选取第一个,本例中初始 pivot 的值为 20)。
    在这里插入图片描述
  • 首先从 right 所指的位置从右向左搜索找到第一个小于 pivot 的元素,然后将其记录在基准元素所在的位置。
    在这里插入图片描述
  • 接着从 left 所指的位置从左向右搜索找到第一个大于 pivot 的元素,然后将其记录在 right 所指向的位置
    在这里插入图片描述
  • 然后再从 right 所指向的位置继续从右向左搜索找到第一个小于 pivot 的元素,然后将其记录在 left 所指向的位置
    在这里插入图片描述
  • 接着,left 继续从左向右搜索第一个大于 pivot 的元素,如果在搜索过程中出现了 left == right ,则说明一趟快速排序结束。此时将 pivot 记录在 left 和 right 共同指向的位置即可
    在这里插入图片描述
 public int[] MySort (int[] arr) {
        return  quickSort(arr, 0, arr.length - 1);
    }
    private int[] quickSort(int[] arr, int left, int right) {
        if (left < right) {
            int pivot = partition(arr, left, right);
            // 基准元素左边递归
            quickSort(arr, left, pivot - 1);
            quickSort(arr, pivot + 1, right);
        }
        return arr;
    }
    public static int partition(int[] arr, int left, int right) {
        // 选取第一个为基准元素
        int pivot = arr[left];
        while (left < right) {
            /* 先从右往移动,直到遇见小于 pivot 的元素 */
            while (left < right && arr[right] > pivot) {
                right--;
            }
            arr[left] = arr[right]; // 记录小于 pivot 的值
            /* 再从左往右移动,直到遇见大于 pivot 的元素 */
            while (left < right && arr[left] < pivot) {
                left++;
            }
            arr[right] = arr[left]; // 记录大于 pivot 的值
        }
        arr[left] = pivot; // 记录基准元素到当前指针指向的区域
        return left; // 返回基准元素的索引
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值