快速排序算法学习总结

快速排序算法


入菊厂两年了,光阴似箭让人唏嘘不已。业务代码确实写了不少,好像什么都知道一点却又不精通,学校学的都忘光了,博客也太久没动过了,实在惭愧。最近打算一点点捡起来,诸君共勉。直接上java代码。
参考了两位同学的博客,传送门:
https://blog.csdn.net/tomcmd/article/details/48009195
https://blog.csdn.net/mingming_shiwo/article/details/75566706

“`
package com.huawei.sort;

public class TestQuickSort {

/*
  快速排序

  算法思路:
  1.首先采用分治的思想,选取基准值把序列分成两个子序列,基准值左侧的子序列都比基准值小,
  而基准值右侧的子序列都比基准值大。
  2.然后用递归的思想,每个子序列只有一个元素时,整个序列变得有序。

  算法步骤:
  1.对于一个数组A(A[0]到A[n-1]),选取基准值key=A[0];
  2.设置两个变量low,high,分别指向数组的首端、尾端;
  3.从尾端开始,一直high--,直到遇到比key小的元素,交换A[high]和A[low];
  4.从首端开始,一直low++,  直到遇到比key大的元素,交换A[low]和A[high];
  5.当low和high相等时,完成一趟快速排序,新的基准值key=A[low]
  6.对于新基准值左右两侧的两个序列,一直递归的进行快速排序,直到每个序列都只有1个元素,整个序列便有序了。
*/


public static void main(String[] args) {
    int[] arr = { 5, 4, 3, 2, 1 };

    System.out.println("before sorted arr = ");
    printArr(arr);

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

    System.out.println("after sorted arr = ");
    printArr(arr);
}

public static void quickSort(int[] arr, int low, int high) {

    if (low < high) {
        // 返回值keyPos是每次排序的基准值下标
        int keyPos = findKeyPosition(arr, low, high);
        // 对左边子序列排序
        quickSort(arr, 0, keyPos - 1);
        // 对右边的子序列排序
        quickSort(arr, keyPos + 1, high);
    }
}

/**
 * 进行一趟快速排序,在排序结束后,返回新的基准值在数组中的下标
 * 
 * @param arr
 *            待排序序列
 * @param low
 *            指向待排序序列的首端
 * @param high
 *            指向待排序序列的尾端
 * @return 新的基准值在数组中的下标
 */
public static int findKeyPosition(int[] arr, int low, int high) {
    // 基准值key
    int key = arr[low];

    while (low < high) {
        while (low < high && arr[high] >= key) {
            high--;
        }
        // arr[low] = arr[high];
        swap(arr, low, high);

        while (low < high && arr[low] <= key) {
            low++;
        }
        // arr[high] = arr[low];
        swap(arr, low, high);
    }

    System.out.println("low = " + low + ",high = " + high);
    // 此时low high相等,arr[low] = key亦可;
    arr[high] = key;
    return low;
}

public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

public static void printArr(int[] arr) {
    for (int i : arr) {
        System.out.print(i + " ");
    }
    System.out.println();
}

}

“`这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值